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
#include <cstdio>
#include <vector>
using namespace std;
vector<int> w[500001], sciecha, gut;
bool odw[500001], bad, cykl;
int n, m, a, b, lvl[500001], akt;
void dfsuj(int a) {
    odw[a] = 1;
    sciecha.push_back(a);
    for (int i = 0; i < w[a].size(); i++) {
        if (odw[w[a][i]] == 1) {
            if (sciecha.size() > lvl[w[a][i]]) {
                if (sciecha[lvl[w[a][i]]] == w[a][i] and w[a][i] != akt)
                    bad = 1;
                if (sciecha[lvl[w[a][i]]] == w[a][i])
                    cykl = 1;
            }
        } else {
            lvl[w[a][i]] = lvl[a] + 1;
            dfsuj(w[a][i]);
        }
    }
    sciecha.pop_back();
    return;
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", &a, &b);
        w[a].push_back(b);
    }
    for (int i = 1; i <= n; i++) {
        cykl = 0;
        bad = 0;
        akt = i;
        dfsuj(akt);
        if (bad != 1) {
        for (int j = 1; j <= n; j++) {
            if (bad == 1)
                break;
            if (odw[j] == 0)
                dfsuj(j);
        }
        }
        if (bad == 0 and cykl == 1)
            gut.push_back(i);
        for (int j = 1; j <= n; j++) {
            lvl[j] = 0;
            odw[j] = 0;
        }
    }
    if (gut.size() == 0) {
        printf("NIE");
        return 0;
    }
    printf("%d\n", gut.size());
    for (int i = 0; i < gut.size(); i++)
        printf("%d ", gut[i]);
    return 0;
}