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
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<string>

using namespace std;

int n,m,d,a,b,licz=0,mx=0,numer,stop[200009];
set<int> secik;
vector<int> tab[200009];
bool odw[200009],odw1[200009];
void DFS0(int q){
	stop[q]=0;
	odw[q]=1;
	odw1[q]=1;
	for(int i=0; i<tab[q].size(); i++){
		if(stop[tab[q][i]]>0){
			stop[tab[q][i]]--;
			if(stop[tab[q][i]]<d) DFS0(tab[q][i]);	
		}
	}
};
void DFS(int q){
	odw[q]=1;
	licz++;
	for(int i=0; i<tab[q].size(); i++){
		if(odw[tab[q][i]]==0 && stop[tab[q][i]]>0) DFS(tab[q][i]);
	}
};
void WYNIK(int q){
	odw1[q]=1;
	secik.insert(q);
	for(int i=0; i<tab[q].size(); i++){
		if(odw1[tab[q][i]]==0 && stop[tab[q][i]]>0) WYNIK(tab[q][i]);
	}
};

main()
{
scanf("%d%d%d", &n, &m, &d);
for(int i=0; i<m; i++){
	scanf("%d%d", &a, &b);
	tab[a].push_back(b);
	tab[b].push_back(a);
	stop[a]++;
	stop[b]++;	
}
for(int i=1; i<=n; i++){
	//cout<<i<<" "<<stop[i]<<endl;
	if(stop[i]<d && stop[i]>0) DFS0(i);	
}
for(int i=1; i<=n; i++){
	licz=0;
	//cout<<i<<" "<<odw[i]<<" "<<stop[i]<<endl;
	if(odw[i]==0 && stop[i]>0) DFS(i);
	if(licz>mx){
		mx=licz;
		numer=i;
	}
}
if(numer==0) printf("NIE\n");
else{
	WYNIK(numer);
	printf("%d\n", mx);
	for(set<int>::iterator it=secik.begin(); it!=secik.end(); ++it){
		printf("%d ", *it);
	}
}
return 0;
}