#include <cstdio>
#include <list>

long long int n, m, a, b;
bool daSieZnalezc = false;
long long int ilosc = 0;

long long int const MAX = 500001LL;

struct Node;

struct Edge{
	//krawedz z v->w
	int w;
//	Edge *rev;  // wska?nik na kraw?d? wsteczn?
	Edge(int w_in){
		w = w_in;
	}
};

struct Vertex{
	int x = 0; //numer wierzcholka
//	int bfs = 0;
	bool visited;
	Vertex(int x_in){
		visited = false;
		x = x_in; 
	}
	Vertex(){
		visited = false;
		x = 0; 
	}
};

Vertex V[MAX+1]; 

std::list<Edge> E[MAX+1];
std::list<Edge> ET[MAX+1];

int czas_wyjscia[MAX+1];
int numcss = 0;
int css[MAX+1];

int q = 1;

void dfs(int v){
  V[v].visited = true;
  for (std::list<Edge>::iterator j = E[v].begin(); j != E[v].end(); ++j) {
    if(!(V[j->w].visited)){ 
      	dfs(j->w);
    }else{
    	daSieZnalezc = true;
	}
  }
  czas_wyjscia[q]=v;
  q++;
}
void dfsT(int v, int nc){
  V[v].visited = true;
  css[nc]++;
  for (std::list<Edge>::iterator j = ET[v].begin(); j != ET[v].end(); ++j) {
    if(!(V[j->w].visited)){ 
      	dfsT(j->w,nc);
    }
  }
}


int main(){
	scanf("%lld %lld", &n, &m);
	for(int i = 1; i <= n; ++i){
		V[i] = Vertex(i);
	}
	for(int i = 1; i <= m; ++i){
		scanf("%d %d", &a, &b);
		E[a].push_back(Edge(b));
		ET[b].push_back(Edge(a));
	//	E[a].back().rev = &E[b].back();
	}
	//dfs pamięta czasy wyjscia
	for(int i = 1; i <= n; ++i){
		if(!V[i].visited){
			dfs(i);
		}
	}
	//wyzeruj visited
	for(int i = 1; i <= n; ++i){
		V[i].visited=false;
	}
	//dfs na odwrotnym grafie
	for(int i = 1; i <= n; ++i){
		if(!V[czas_wyjscia[i]].visited){
			numcss++;
			dfsT(i,numcss);
		}
	}
	//sprawdz czy więcej niż jedna css
	int czy = 0;
	for(int i = 1; i <= numcss; ++i){
		if(css[i] > 1){
			if(czy == 0){
				czy = 1;
			}else{
				ilosc = 0;
			}
		}
	}
	
	if(!daSieZnalezc){
		printf("NIE");
	}else{
		if(ilosc == 0){
			printf("%lld", ilosc);
		}else{
			printf("%lld", ilosc);
			//tutaj petla
		}
	}
	
//	printf("\n");
//	for(int i = 1; i <= n; ++i){
//		printf("i: %d ", i);
//		for (std::list<Edge>::iterator j = E[i].begin(); j != E[i].end(); ++j) {
//			printf("(%lld,%lld)",i, j->w);
//		}
//	}
	
}
