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
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

vector < vector < int > > V;
int wyrzucone[1000005];
int liczba_sas[1000005];
priority_queue < pair < int, int > > Q;

int DFS(int v, int nr)
{
	int wynik = 1;
	wyrzucone[v] = nr;
	for(int i=0; i<V[v].size(); i++)
	{
		int sas = V[v][i];
		if (wyrzucone[sas])
			continue;
		wynik += DFS(sas, nr);
	}
	return wynik;
}

int main()
{
	int n, m, k;
	scanf("%d%d%d", &n, &m, &k);
	V.resize(n+5);
	int a, b;
	while(m--)
	{
		scanf("%d%d", &a, &b);
		V[a].push_back(b);
		V[b].push_back(a);
		liczba_sas[a]++;
		liczba_sas[b]++;
	}
	for(int i=1; i<=n; i++)
		Q.push({-V[i].size(),i});
	
	while(!Q.empty() && Q.top().first > -k)
	{
		int v  = Q.top().second;
		Q.pop();
		if (wyrzucone[v])
			continue;
		wyrzucone[v] = true;
		for(int i=0; i<V[v].size(); i++)
		{
			int sas = V[v][i];
			if (wyrzucone[sas])
				continue;
			liczba_sas[sas]--;
			Q.push({-liczba_sas[sas], sas});
		}
	}
	int wynik = 0, ktore = 2, naj = 0;
	for(int i=1; i<=n; i++)
		if (!wyrzucone[i])
		{
			int pom = DFS(i, ktore);
			if (pom > wynik)
			{
				naj = ktore;
				wynik = pom;
			}
			ktore++;
		}
	vector < int > Wynik;
	
	for(int i=1; i<=n; i++)
		if(wyrzucone[i] == naj)
			Wynik.push_back(i);
	sort(V.begin(), V.end());
	if (wynik == 0)
		printf("NIE\n");
	else
	{
		printf("%d\n", wynik);
		for(int i=0; i<Wynik.size(); i++)
			printf("%d ", Wynik[i]);	
	}
}