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
#include "cstdio"
#include "vector"
#include "deque"
#include "algorithm"
using namespace std;
long long n,m,d,a,b,v,maks,ile[1000005];
vector <long long> G[1000005];
deque <long long> kolejka,wynik;
bool odw[1000005],zle[1000005];
int main()
{
	scanf ("%lld%lld%lld", &n, &m, &d);
	for (int i=0; i<m; i++)
	{
		scanf ("%lld%lld", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
		ile[a]++;
		ile[b]++;
	}
	
	for (int i=1; i<=n; i++)
	{
		if (ile[i]<d)
		{
			zle[i]=true;
			kolejka.push_back(i);
		}
	}
	
	for (int i=0; i<kolejka.size(); i++)
	{
		v=kolejka[i];
		ile[v]=0;
		for (int j=0; j<G[v].size(); j++)
		{
			ile[G[v][j]]--;
			if (!zle[G[v][j]] && ile[G[v][j]]<d)
			{
				zle[G[v][j]]=true;
				kolejka.push_back(G[v][j]);
			}
		}
	}
	
	for (int i=1; i<=n; i++)
	{
		if (!odw[i] && !zle[i])
		{
			kolejka.clear();
			kolejka.push_back(i);
			odw[i]=true;
			for (int j=0; j<kolejka.size(); j++)
			{
				v=kolejka[j];
				for (int r=0; r<G[v].size(); r++)
				{
					if (!odw[G[v][r]] && !zle[G[v][r]])
					{
						kolejka.push_back(G[v][r]);
						odw[G[v][r]]=true;
					}
				}
			}
			if (kolejka.size()>maks)
			{
				maks=kolejka.size();
				wynik.clear();
				while (!kolejka.empty())
				{
					wynik.push_back(kolejka.front());
					kolejka.pop_front();
				}
			}
		}
	}
	
	if (maks>0)
	{
		printf ("%lld\n", maks);
		sort (wynik.begin(),wynik.end());
		for (int i=0; i<wynik.size(); i++) printf ("%lld ", wynik[i]);
		printf ("\n");
	}
	else printf ("NIE\n");

	
	return 0;
}