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

using namespace std;

const int N=2e5+50;
vector<int> Kra[N];
int Stopnie[N];
set< pair<int, int> >Sto;
set< pair<int, int> >::iterator it;
int Odw[N];
vector<int> Spo[N];

void DFS(int v, int ktora){
	Spo[ktora].push_back(v);
	Odw[v]=1;
	for(int i=0; i<Kra[v].size(); i++){
		if(Odw[ Kra[v][i] ]==0){
			DFS(Kra[v][i], ktora);
		}
	}
}

void Usuwaj(int d){
	int i, aktu;
	pair<int, int> mini;
	it=Sto.begin();
	while(Sto.size() > 0 && (*Sto.begin()).first<d){
		mini = (*Sto.begin());
		Odw[mini.second]=1;
		Sto.erase( (*Sto.begin()) );
		for(i=0; i<Kra[ mini.second ].size(); i++){
			aktu=Kra[mini.second][i];
			it=Sto.find( make_pair( Stopnie[aktu], aktu) );
			if(it!=Sto.end() && Stopnie[aktu]>0){
				Sto.erase(it);
				Stopnie[aktu]--;
				Sto.insert( make_pair( Stopnie[aktu], aktu) );
			}
		}
	}
}

int main (){
	int n, m, d, i, a, b, wynik, ktory;
	wynik=0;
	scanf("%d%d%d", &n, &m, &d);
	for(i=1; i<=m; i++){
		scanf("%d%d", &a, &b);
		Kra[a].push_back(b);
		Kra[b].push_back(a);
		Stopnie[a]++;
		Stopnie[b]++;
	}
	for(i=1; i<=n; i++){
		Sto.insert( make_pair(Kra[i].size(), i) );
	}
	Usuwaj(d);
	for(i=1; i<=n; i++){
		if(Odw[i]==0){
			DFS(i, i);
		}
	}
	for(i=1; i<=n; i++){
		if(wynik<Spo[i].size() ){
			wynik=Spo[i].size();
			ktory=i;
		}
	}
	if(wynik==0){
		printf("NIE\n");
		return 0;
	}
	sort(Spo[ktory].begin(), Spo[ktory].end() );
	printf("%d\n", wynik);
	for(i=0; i<Spo[ktory].size(); i++){
		printf("%d ", Spo[ktory][i]);
	}
	printf("\n");
	return 0;
}