1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
vector<int> graf[1000006];

int deg[1000006];
int del[1000006];
int odw[1000006];
int kol[1000006];

int DFS(int start, int kolor)
{
	odw[start] = 1;
	kol[start] = kolor;
	int ans = 1;
	for(int i = 0; i < graf[start].size(); i++)
	{
		if(!odw[graf[start][i]])
		{
			ans += DFS(graf[start][i], kolor);
		}
	}
	return ans;
}

int main()
{
	int n, m, k;
	scanf("%d %d %d", &n, &m, &k);
	for(int a =0; a < m; a++)
	{
		int ta, tb;
		scanf("%d %d", &ta, &tb);
		graf[ta].push_back(tb);
		graf[tb].push_back(ta);
		deg[ta]++;
		deg[tb]++;
	}

	queue<int> to_del;
	for(int i = 1; i <= n; i++)
	{
		if(deg[i] < k)
		{
			to_del.push(i);
			del[i] = 1;
		}
	}
	while(! to_del.empty())
	{
		int ter = to_del.front();
		to_del.pop();
		for(int i = 0; i < graf[ter].size(); i++)
		{
			int sas = graf[ter][i];
			deg[sas] --;
			if(!del[sas] && deg[sas] < k)
			{
				del[sas] = 1;
				to_del.push(sas);
			}

		}
	}

	int odp = 0;
	int sp = -1;
	for(int i = 1; i <= n; i++)
	{
		if(del[i])
			odw[i] = 1;
	}
	for(int i = 1; i <= n; i++)
	{
		if(!odw[i])
		{
			int wyn = DFS(i, i);
			if(wyn > odp)
			{
				odp = wyn;
				sp = i;
			}
		}
	}
	if(odp == 0)
	{
		printf("NIE\n");
	}
	else
	{
		printf("%d\n", odp);
		for(int i = 1; i <= n; i++)
		{
			if(kol[i] == sp)
			{
				printf("%d ", i);
			}
		}
		printf("\n");
	}
	return 0;
}