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
85
86
87
88
89
90
91
//Aleksander Łukasiewicz
#include<bits/stdc++.h>
using namespace std;

#define fru(j,n) for(int j=0; j<(n); ++j)
#define tr(it,v) for(typeof((v).begin()) it=(v).begin(); it!=(v).end(); ++it)
#define x first
#define y second
#define pb push_back
#define mp make_pair
#define ALL(G) (G).begin(),(G).end()

typedef long long LL;
typedef pair<int,int> PII;
typedef vector<int> VI;

const int INF = 1000000009;
const int MAXN = 200000;

int n, m, d, counter;
vector<int> graph[MAXN + 3];
int deg[MAXN + 3];
bool deleted[MAXN + 3];
int visited[MAXN + 3];
stack<int> S;

void Read(){
	scanf("%d %d %d", &n, &m, &d);
	for(int i=0; i<m; i++){
		int a, b;
		scanf("%d %d", &a, &b);
		graph[a].pb(b);
		graph[b].pb(a);
		deg[a]++; deg[b]++;
	}
}

void Dfs(int v, int curr){
	visited[v] = curr;
	counter++;
	for(int i=0; i<(int)graph[v].size(); i++){
		int u = graph[v][i];
		if(!deleted[u] && !visited[u])
			Dfs(u, curr);
	}
}
	

PII Solve(){
	for(int i=1; i<=n; i++)
		if(deg[i] < d)
			S.push(i), deleted[i] = true;
	while(!S.empty()){
		int v = S.top();
		S.pop();
		for(vector<int>::iterator it = graph[v].begin(); it != graph[v].end(); it++){
			deg[*it]--;
			if(deg[*it] < d && !deleted[*it])
				deleted[*it] = true, S.push(*it);
		}
	}
	
	int ret = 0, ind = -1;
	
	for(int i=1; i<=n; i++)
		if(!deleted[i] && !visited[i]){
			counter = 0;
			Dfs(i, i);
			if(counter > ret)
				ret = counter, ind = i;
		}
	
	return mp(ret, ind);
}

int main(){
    Read();
    PII ans = Solve();
    if(ans.x == 0)
        puts("NIE");
    else{
        printf("%d\n", ans.x);
        for(int i=1; i<=n; i++)
            if(visited[i] == ans.y)
                printf("%d ", i);
		puts("");
    }
    
    
return 0;
}