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

#define MAX_N 200000

int n,m,d;
vector<int> V[MAX_N];
int T[MAX_N];
bool erased[MAX_N];
bool visited[MAX_N];
int C[MAX_N];
int A[MAX_N];
int ans=0;

int main(){
    scanf("%d%d%d",&n,&m,&d);
    for(int a=0;a<m;++a){
        int q,w;
        scanf("%d%d",&q,&w);
        --q;--w;
        V[q].push_back(w);
        V[w].push_back(q);
    }
    for(int a=0;a<n;++a)T[a]=V[a].size();

    for(int a=0;a<n;++a){
        if(!erased[a] && T[a]<d){
            queue<int> Q;
            Q.push(a);
            while(!Q.empty()){
                int p=Q.front();
                Q.pop();
                if(erased[p])continue;
                erased[p]=1;
                for(int x:V[p]){
                    --T[x];
                    if(!erased[x] && T[x]<d){
                        Q.push(x);
                    }
                }
            }
        }
    }

    int color=0;
    for(int a=0;a<n;++a)C[a]=-1;
    for(int a=0;a<n;++a){
        if(!erased[a] && !visited[a]){
            queue<int> Q;
            Q.push(a);
            while(!Q.empty()){
                int p=Q.front();
                Q.pop();
                if(visited[p])continue;
                visited[p]=1;
                C[p]=color;
                ++A[color];
                if(A[ans]<A[color])ans=color;
                for(int x:V[p]){
                    if(!erased[x] && !visited[x])Q.push(x);
                }
            }
            
            ++color;
        }
    }

    if(A[ans]==0)printf("NIE");
    else{
        printf("%d\n",A[ans]);
        for(int a=0;a<n;++a){
            if(C[a]==ans)printf("%d ",a+1);
        }
    }

    return 0;
}