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
#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
bool odw[200001];
vector <int> w[200001], spoj[200001];
int n, m, d, a, b, siz[200001], maks, nr, pom;
void dfsuj (int c) {
    odw[c] = 1;
    for (int i = 0; i < w[c].size(); i++) {
        siz[w[c][i]]--;
        if (siz[w[c][i]] < d and odw[w[c][i]] == 0)
            dfsuj(w[c][i]);
    }
}
void dfsuj2(int c) {
    spoj[pom].push_back(c);
    odw[c] = 1;
    for (int i = 0; i < w[c].size(); i++) {
        if (odw[w[c][i]] == 0) {
            dfsuj2(w[c][i]);
        }
    }
}
int main() {
    scanf("%d%d%d", &n, &m, &d);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", &a, &b);
        w[a].push_back(b);
        w[b].push_back(a);
    }
    for (int i = 1; i <= n; i++)
		siz[i] = w[i].size();
    for (int i = 1; i <= n; i++) {
        if (odw[i] == 0 and siz[i] < d)
            dfsuj(i);
    }
    for (int i = 1; i <= n; i++) {
        pom = i;
        if (odw[i] == 0) {
            dfsuj2(i);
            if (spoj[i].size() > maks) {
                maks = spoj[i].size();
                nr = i;
            }
        }
    }
    sort(spoj[nr].begin(), spoj[nr].begin() + maks);
    if (maks == 0) {
        printf("NIE");
        return 0;
    }
    printf("%d\n", maks);
    for (int i = 0; i < maks; i++)
        printf("%d ", spoj[nr][i]);
    return 0;
}