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
92
#include <cstdio>
#include <vector>
#include <set>
int n,m;
std::vector<int> e[500000];
int odl[500000], root[500000], odw[500000], prev[500000];
int a,b,liczba_odw, liczba_wynikow;
std::set<int> wyn, nowy;
bool pierwszy = true;
void DFS(int v, int codl) {
	// printf("Visit %d\n", v);
	if (!pierwszy && wyn.size() == 0) {
		return;
	}

	if (!odw[v]) {
		liczba_odw++;
	}
	odl[v] = codl-1;
	odw[v] = 1;
	for (auto i : e[v]) {
		if (!pierwszy && wyn.size() == 0) {
			break;
		}
		if (odw[i] == 1) {
			int from = v;
			if (pierwszy) {
				// printf("Pierwszy %d ", i);
				pierwszy = false;
				wyn.insert(i);
				while(from != i) {
					// printf("%d ", from);
					wyn.insert(from);
					from=prev[from];
				}
			} else {
				// printf("Znajdłem cykl %d ", i);
				nowy.clear();
				if (wyn.find(i) != wyn.end()) {
					nowy.insert(i);
				}
				while (from != i) {
					// printf("%d", from);
					if (wyn.find(from) != wyn.end()) {
						// putchar('.');
						nowy.insert(from);
					// } else {
					// 	putchar(' ');
					}
					from = prev[from];
				}
				std::swap(nowy, wyn);
			}
			// printf("\nwyn: ");
			// for (auto i : wyn) {
			// 	printf("%d ", i);
			// }
			// printf("\n");
		} else if (odw[i] == 0) {
			prev[i] = v;
			root[i] = root[v];
			DFS(i, codl+1);
		} else if (odw[i] == 2 && root[i] == root[v]) {
			if (odl[i] >= codl) {
				prev[i] = v;
				DFS(i, codl+1);
			} 
		}
	}
	odw[v] = 2;
}
int main() {
	scanf("%d%d", &n, &m);
	for (int i = 0; i < m; i++) {
		scanf("%d%d", &a, &b);
		e[a-1].push_back(b-1);
	}
	for (int i = 0; i < n && liczba_odw < n && (pierwszy || wyn.size() > 0) ; i++) {
		if (!odw[i]) {
			root[i] = i;
			DFS(i, 1);
		}
	}
	if (pierwszy) {
		printf("NIE\n");
		return 0;
	}
	printf("%lu\n", wyn.size());
	for (auto i : wyn) {
		printf("%d ", i+1);	
	}
}