#include <stdio.h>

int N,m,a,b;
int drogi[1000002][2];
int ilosci[500002];
int wskaz_pocz[500003];
int slad[500002];
int wskaz_slad,liczba_cykli=0,sa_takie_skrzyzowania=1;
int odwiedzone[500002];
int zacyklowane[500002];

//int icsoli[1000002];
//int igord[1000002][2];



int SORT_drogi(int pocz,int kon) //Przepisane z Cormena
{
int sx,sxx,sq,si,sj,pom;
if(pocz<kon)
    {
     sx = drogi[kon][0];
     sxx = drogi[kon][1];
     si=pocz-1;
     for(sj=pocz;sj<=kon-1;sj++)
        {
         if((drogi[sj][0]<sx) || (( drogi[sj][0]==sx ) && ( drogi[sj][1]<=sxx )))
            {
             si++;
             pom=drogi[si][0]; drogi[si][0]=drogi[sj][0]; drogi[sj][0]=pom;
             pom=drogi[si][1]; drogi[si][1]=drogi[sj][1]; drogi[sj][1]=pom;
            }
        }
     pom=drogi[si+1][0]; drogi[si+1][0]=drogi[kon][0]; drogi[kon][0]=pom;
     pom=drogi[si+1][1]; drogi[si+1][1]=drogi[kon][1]; drogi[kon][1]=pom;
     sq=si+1;
     SORT_drogi(pocz,sq-1);
     SORT_drogi(sq+1,kon);
    }
return 0;
}




int SZUKAJ(int kolejny_wezel)
{
odwiedzone[kolejny_wezel]=1;
wskaz_slad++;
slad[wskaz_slad]=kolejny_wezel;

for (int e=wskaz_pocz[kolejny_wezel]; e<wskaz_pocz[kolejny_wezel+1]; e++)
	{
	if (( odwiedzone[drogi[e][1]] == 1) && (sa_takie_skrzyzowania==1))
		{
		// MAM CYKL
		//printf("JEST CYKL (od tylu):\n%ld ",drogi[e][1]);
		sa_takie_skrzyzowania=0;
		
		liczba_cykli++;
		for (int f=wskaz_slad; drogi[e][1] != slad[f] ; f--)
			{//idê do ty³u po œladzie...
			zacyklowane[slad[f]]++;
			
			//printf("%ld ",slad[f]);
			
			if (zacyklowane[slad[f]] == liczba_cykli) sa_takie_skrzyzowania=1; 
			}
		zacyklowane[drogi[e][1]]++;
		if (zacyklowane[drogi[e][1]] == liczba_cykli) sa_takie_skrzyzowania=1;
		//printf("\n");
		
		if (sa_takie_skrzyzowania==0) break; //{ printf("JUZ WIDZE, ZE ODPOWIEDZ TO 0\n");  break; }
		}
	else
		{
		SZUKAJ(drogi[e][1]);
		}
	
	
	}

wskaz_slad--;
odwiedzone[kolejny_wezel]=0;
return 0;
}



int main()
{
for (int i=1; i<=N; i++) 
	{
	ilosci[i]=0;
//	icsoli[i]=0;
	}


scanf("%ld %ld",&N,&m);
for (int i=1;i<=m;i++)
	{
	scanf("%ld %ld",&a,&b);
	drogi[i][0]=a;
	drogi[i][1]=b;
//	igord[i][0]=b;
//	igord[i][1]=a;
	ilosci[a]++;
//	icsoli[b]++;
	}




/////////////////////////////////////////////////////////////////////////////*/
/*N=4; m=5;
drogi[1][0]=1; drogi[1][1]=2;
drogi[2][0]=2; drogi[2][1]=3;
drogi[3][0]=3; drogi[3][1]=1;
drogi[4][0]=3; drogi[4][1]=4;
drogi[5][0]=4; drogi[5][1]=2;
/////////////////////////////////////////////////////////////////////////////*/
/*N=3; m=2;
drogi[1][0]=1; drogi[1][1]=2;
drogi[2][0]=2; drogi[2][1]=3;
/////////////////////////////////////////////////////////////////////////////*/
/*N=16; m=19;
drogi[1][0]=13; drogi[1][1]=16;
drogi[2][0]=12; drogi[2][1]=13;
drogi[3][0]=13; drogi[3][1]=15;
drogi[4][0]=15; drogi[4][1]=4;
drogi[5][0]=4; drogi[5][1]=3;
drogi[6][0]=3; drogi[6][1]=2;
drogi[7][0]=2; drogi[7][1]=3;
drogi[8][0]=2; drogi[8][1]=14;
drogi[9][0]=14; drogi[9][1]=2;
drogi[10][0]=14; drogi[10][1]=4;
drogi[11][0]=2; drogi[11][1]=5;
drogi[12][0]=6; drogi[12][1]=7;
drogi[13][0]=5; drogi[13][1]=6;
drogi[14][0]=7; drogi[14][1]=8;
drogi[15][0]=8; drogi[15][1]=14;
drogi[16][0]=11; drogi[16][1]=12;
drogi[17][0]=10; drogi[17][1]=11;
drogi[18][0]=9; drogi[18][1]=10;
drogi[19][0]=3; drogi[19][1]=9;
/////////////////////////////////////////////////////////////////////////////*/
/////////////////////////////////////////////////////////////////////////////*/
/////////////////////////////////////////////////////////////////////////////*/
/*for (int i=1; i<=m; i++)
	{
//	igord[i][0]=drogi[i][1];
//	igord[i][1]=drogi[i][0];
	ilosci[drogi[i][0]]++;
//	icsoli[igord[i][0]]++;
	}
*/




SORT_drogi(1,m);

wskaz_pocz[1]=1;
for (int i=2; i<=N+1; i++)
	{
	wskaz_pocz[i]=wskaz_pocz[i-1]+ilosci[i-1];
	}


//for (int i=1; i<=m; i++) printf("%ld %ld\n",drogi[i][0],drogi[i][1]);
//for (int i=1; i<=N; i++) printf("ilosci[%ld]=%ld\n",i,ilosci[i]);
//for (int i=1; i<=N+1; i++) printf("wskaz_pocz[%ld]=%ld\n",i,wskaz_pocz[i]);


for (int i=1;i<=N;i++) {odwiedzone[i]=-1; zacyklowane[i]=0;}
wskaz_slad=0;
sa_takie_skrzyzowania=1;
//int startowy=1;
//while (ilosci[startowy]==0) startowy++;


for (int startowy=1; startowy<=N; startowy++) if ((ilosci[startowy]>0) && (odwiedzone[startowy]==-1) && (sa_takie_skrzyzowania==1))
	{
	odwiedzone[startowy]=1;
	wskaz_slad++;
	slad[wskaz_slad]=startowy;
	
	for (int qq=wskaz_pocz[startowy]; qq<wskaz_pocz[startowy+1]; qq++)
		{
		//printf("Startujemy z %ld do %ld\n",startowy,drogi[qq][1]);
		
		if (sa_takie_skrzyzowania==1) SZUKAJ(drogi[qq][1]);
			
		}
	
	
	wskaz_slad--;
	odwiedzone[startowy]=0;
	}

if (sa_takie_skrzyzowania==0)
	{
	printf("%ld\n\n",0);
	}
else
	{
	sa_takie_skrzyzowania=0;
	for (int i=1; i<=N; i++) if (zacyklowane[i]==liczba_cykli) {sa_takie_skrzyzowania++; slad[sa_takie_skrzyzowania]=i;}
	
	if (liczba_cykli==0)
		{
		printf("NIE");
		}
	else
		{ 
		printf("%ld\n",sa_takie_skrzyzowania);
		for (int i=1; i<=sa_takie_skrzyzowania; i++) printf("%ld ",slad[i]);
		printf("\n");
		}
	}


return 0;
}




