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
#include <cstdio>
#include <list>
#include <vector>
#include <set>
using namespace std;

list<int> miasta;
list<int>::iterator it;
vector<set<int> > graf;
set<int>::iterator sit;
vector<int> S,used;

int dfs(int v,int ss) {
	used[v]=ss;
	int s=1;
	for (set<int>::iterator sit=graf[v].begin();sit!=graf[v].end();sit++) {
		int u = *sit;
		if (!used[u])
			s+=dfs(u,ss);
	}
	return s;
}

int main() {
	int n,m,d;
	scanf("%d%d%d",&n,&m,&d);
	for (int i=1;i<=n;i++) miasta.push_back(i);
	graf.resize(n+1);
	for (int i=0;i<m;i++) {
		int a,b;
		scanf("%d%d",&a,&b);
		graf[a].insert(b);
		graf[b].insert(a);
	}
	bool change;
	do {
		change=false;
		for (it=miasta.begin();it!=miasta.end();) {
			if (graf[*it].size()<d) {
				for (sit=graf[*it].begin();sit!=graf[*it].end();sit++)
					graf[*sit].erase(*it);
				it = miasta.erase(it);
				change=true;
			} else
				it++;
		}
	} while (change);
	//for (it=miasta.begin();it!=miasta.end();it++) printf("%d(%d) ",*it,graf[*it].size()); puts("");
	for (it=miasta.begin();it!=miasta.end();it++) S.push_back(*it);
	used.resize(n+1);
	int maxn=0,maxss;
	int ss=0;
	for (int i=0;i<S.size();i++) {
		int sn;
		if (!used[S[i]]) {
			sn=dfs(S[i],++ss);
			if (sn>maxn) {
				maxn=sn;
				maxss=ss;
			}
		}
	}
	if (ss==0)
		printf("NIE");
	else {
		printf("%d\n",maxn);
		for (int i=1;i<=n;i++)
			if (used[i]==maxss) printf("%d ",i);
		//puts("");
	}
	return 0;
}