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
93
94
95
96
97
98
#include<iostream>
#include<vector>

#define MAXN 500003

using namespace std;

vector<int> V[MAXN];
vector<int> wazne;

int odw[MAXN];

int a,b,n,m,sasiad;
bool jest;
/*
bool dfs(int pocz){
	odw[pocz] = 1;
	for(int i = 0; i < V[pocz].size(); i++){
		sasiad = V[pocz][i];
		
		if(odw[sasiad] == 1)return true;
		else dfs(sasiad);	
	}
}*/

void dfs2(int pocz){
	odw[pocz] = 1;
	
	for(int i = 0; i < V[pocz].size(); i++){
		sasiad = V[pocz][i];
		
		if(odw[sasiad] == 1){
			jest = 1;
			return;		
		}
		else if(odw[sasiad] == 0)dfs2(sasiad);	
	}
	
	odw[pocz] = 2;
}

bool sprawdz_cykl(){
	
	for(int i = 1; i <= n; i++){
		if(odw[i] == 0){
			dfs2(i);
			if(jest == 1)return true;
		}
	}
	return false;
}

void wyczysc(){
	for(int i = 1; i <= n; i++)odw[i] = 0;	
}

int main(){
	ios_base::sync_with_stdio(0);
	
	cin >> n >> m;
	
	for(int i = 0; i < m; i++){
		cin >> a >> b;
		V[a].push_back(b);	
	}
	
	//1. sprawdz, czy w ogole jest jakis cykl:
	if(!sprawdz_cykl()){
		cout << "NIE" << endl;	
	}
	else{
		//2. dla kazdego wierzcholka sprawdz, czy bez niego nadal istnieje jakis cykl
		for(int i = 1; i <= n; i++){
			wyczysc();
			
			jest = 0;
			odw[i] = 2;
			
			for(int j = 1; j <= n; j++){
				if(odw[j] == 0){
					dfs2(j);
					if(jest == 1)break;		
				}
			}
			if(jest == 0)wazne.push_back(i);
			
		}
		
		cout << wazne.size() << endl;
		
		for(int i = 0; i < wazne.size(); i++){
			cout<<wazne[i]<<" ";	
		}
		cout << endl;
	}

	return 0;
}