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
#include <iostream>
#include <vector>
#include <stack>

using namespace std;
int n,m,ilosc_cykli = 0, i, j;
vector<int> A[500001],WIERZ;  
bool NOWY[500001];
int CYKLE[500001];

stack<int> stos;
bool cykl = false;
bool dfs(int v, int u)
{
stos.push(v);
NOWY[v]=false;
for(int i = 0;i<A[v].size();i++)
					{
					int w=A[v][i];
					if(NOWY[w] && dfs(w,u)) return true;
					else if (w == u){
							ilosc_cykli++;
							return true;
							
							
						}
					}  
stos.pop();
return false;					                   
}                                                                  
          
int main()
{
ios_base::sync_with_stdio(0);
    
    cin>>n>>m;
    int w1,w2;
    for(i=1;i<=m;++i) {
                          cin>>w1>>w2;
                          A[w1].push_back(w2);
                          }                      
	for(i=1;i<=n;++i)
	{						      
	    for(j=1;j<=n;++j) NOWY[j]=true;
	    if(dfs(i,i)) {
	    	bool byl_wierzcholek = false;
							while(!stos.empty()){
										CYKLE[stos.top()]++;
										if(CYKLE[stos.top()] == ilosc_cykli) byl_wierzcholek = true;
										stos.pop();	
										}
							if(byl_wierzcholek == false) {
								cout <<"NIE";
								return 0;
							}
		}  
	}
	if(ilosc_cykli > 0) 
	for(i=1;i<=n;++i) if (CYKLE[i] == ilosc_cykli) {
			WIERZ.push_back(i);
		}
	
	if(WIERZ.size() > 0) {
		cout << WIERZ.size() << endl;
		for(i = 0; i < WIERZ.size(); ++i) cout << WIERZ[i] <<" ";
	}
	else cout <<"NIE";


return 0;
}