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
#include <iostream>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std;

const int maxn=200005;
vector<int> nast[maxn];
int usuniete[maxn];
int odw[maxn];
queue<int>q;

int bfs(int wierz, int id){
	int ile=0;
	q.push(wierz);
	while(!q.empty()){
		wierz=q.front();
		q.pop();
		if(odw[wierz]>0) continue;
		//cout << "wierz "<< wierz << " id " << id << endl;
		odw[wierz]=id;
		ile++;
		for(int i=0; i<nast[wierz].size(); i++) 
			if(odw[nast[wierz][i]]==0 && usuniete[nast[wierz][i]]==0) q.push(nast[wierz][i]);
	}
	return ile;
}

int main(){
	int n,m,d;
	cin >> n >> m >> d;
	for(int i=0; i<m; i++){
		int a,b;
		cin >> a >> b;
		nast[a].push_back(b);
		nast[b].push_back(a);
	}
	for(int i=1; i<=n; i++){
		usuniete[i]=0;
		odw[i]=0;
	}
	while(true){
		//cout << "!!" << endl;
		bool usunieto=false;
		for(int i=1; i<=n; i++){
			int suma=0;
			if(usuniete[i]==1) continue;
			for(int j=0; j<nast[i].size(); j++)
				if(usuniete[nast[i][j]]==0) suma++;
		//	cout << "i " << i << " suma " << suma << endl;
			if(suma<d){
		//		cout << "usuwamy " << i << endl;
				usuniete[i]=1;
				usunieto=true; 
				} 
		}
		if(usunieto==false) break;	
	//	system("pause");
	}
	int ile=0;
	int maxile=0;
	int id=1;
	int maxid=0;
	for(int i=1; i<=n; i++){
		if(odw[i]==0 && usuniete[i]==0){
			ile=bfs(i,id);
			if(maxile<ile){
				maxile=ile;
				maxid=id;	
			}
			id++;
		}
	}
	if(maxile>0){
		cout << maxile << endl;
		for(int i=1; i<=n; i++) if(odw[i]==maxid) cout << i << " ";
		cout << endl;
	}
	else cout << "NIE" << endl;
	return 0;
}