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
#include<bits/stdc++.h>
using namespace std;
#define REP(i, n) for(int i = 0; i < (n); i++)
#define SIZE(s) ((int) (s).size())
#define ALL(s) s.begin(), s.end()
#define MP make_pair
#define ST first
#define ND second
using PII = pair<int, int>;

const int N = 2e5;
int n, m, d;
vector<int> g[N];
int deg[N];
bool visited[N];
vector<int> toremove;
vector<int> cc;

void dfs(int u){
  cc.push_back(u);
  visited[u] = true;
  for(int v : g[u])
    if(!visited[v]) dfs(v);
}

int main(){
  assert(scanf("%d%d%d", &n, &m, &d) == 3);
  REP(i, m){
    int ai, bi;
    assert(scanf("%d%d", &ai, &bi) == 2);
    --ai; --bi;
    g[ai].push_back(bi);
    g[bi].push_back(ai);
  }
  REP(u, n){
    deg[u] = g[u].size();
    if(deg[u] < d){
      toremove.push_back(u);
    }
  }
  REP(i, SIZE(toremove)) {
    int u = toremove[i];
    visited[u] = true;
    for(int v : g[u]){
      if(deg[v]-- == d){
        toremove.push_back(v);
      }
    }
  }
  vector<int> maxcc;
  REP(u, n) if(!visited[u]){
    cc.clear();
    dfs(u);
    if(cc.size() > maxcc.size()) maxcc = cc;
  }
  if(maxcc.empty()){
    printf("NIE\n");
  } else {
    sort(ALL(maxcc));
    printf("%d\n", SIZE(maxcc));
    for(auto v : maxcc) printf("%d ", v + 1);
    printf("\n");
  }
  return 0;
}