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

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define VAR(v,w) __typeof(w) v=(w)
#define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it)
#define PB push_back
#define ALL(c) (c).begin(),(c).end()

typedef vector<int> VI;
typedef vector<VI> VVI;

int n, m, d;
VVI g;
int c[200000], p[200000];

int main() {
	scanf("%d%d%d", &n, &m, &d);
	g.resize(n);
	REP(j,m) {
		int a, b;
		scanf("%d%d", &a, &b);
		--a;
		--b;
		g[a].PB(b);
		g[b].PB(a);
		++c[a];
		++c[b];
	}
	queue<int> q;
	REP(i,n) if (c[i] < d) q.push(i);
	while (!q.empty()) {
		int v = q.front();
		q.pop();
		c[v] = 0;
		FORE(it,g[v]) if (c[*it] && c[*it]-- == d) q.push(*it);
	}
	int best = 0, bestCount = 0;
	REP(i,n) if (c[i] && !p[i]) {
		p[i] = i + 1;
		int count = 1;
		q.push(i);
		while (!q.empty()) {
			int v = q.front();
			q.pop();
			FORE(it,g[v]) if (c[*it] && !p[*it]) {
				p[*it] = i + 1;
				++count;
				q.push(*it);
			}
		}
		if (count > bestCount) {
			best = i + 1;
			bestCount = count;
		}
	}
	if (!best) {
		printf("NIE\n");
		return 0;
	}
	VI s;
	REP(i,n) if (p[i] == best) s.PB(i + 1);
	sort(ALL(s));
	printf("%d\n", int(s.size()));
	bool start = 1;
	FORE(it,s) {
		printf(start ? "%d" : " %d", *it);
		start = 0;
	}
	printf("\n");
}