#include <iostream>
#include <stack>
#include <queue>
using namespace std;

int trasa[1000001][2];
int mm[500001]; //informacja o tym, z iloma innymi skrzyżowaniami skrzyżowanie jest powiązane)
int rmm[500001];
int ild[500001];
int rild[500001];
int spow[500001]; //w jakim punkcie powm trzeba zacząć, żeby sprawdzić dla danego skrzyżowania, z jakimi jest powiązany
int rspow[500001];
int powm[1000001]; //informacja o tym, z jakimi skrzyżowaniami skrzyżowanie jest powiązane
int rpowm[1000001];
int wynik[500001]; //zawiera informacje o byciu na skrzyżowaniu
int dlcykl = 0; //zawiera informacje o dlugosci calego cyklu
int krykol[500001]; //zawiera mapowanie z skrzyzowania na miejsce w cyklu kryycznym

int odleg(int _od, int _do)
{
   if(_do == -1)
      return -1;
   int odl = krykol[_do] - krykol[_od];
   if(odl <= 0)
      odl += dlcykl;
   return odl;
}

int main()
{
	ios_base::sync_with_stdio(0);

//Wczytywanie
	int n; //ilosc skrzyżowań
	int m; //ilosc drog
	
	cin>>n;
	cin>>m;
	
	for(int i=0; i<m; i++)
	{
      cin>>trasa[i][0];
      cin>>trasa[i][1];
      
      mm[trasa[i][0] - 1]++;                    //ilość wychodzących
      rmm[trasa[i][1] - 1]++;                   //ilość wchodzących
      ild[trasa[i][0] - 1]++;
      rild[trasa[i][1] - 1]++;
   }   

   spow[0] = 0;
   rspow[0] = 0;
   for(int i=1; i<n; i++)
	{
      spow[i] = spow[i-1] + mm[i-1];
      rspow[i] = rspow[i-1] + rmm[i-1];
      wynik[i] = 0;
   }
      
   for(int i=0; i<m; i++)
	{
      powm[spow[trasa[i][0] - 1]] = trasa[i][1];
      rpowm[rspow[trasa[i][1] - 1]] = trasa[i][0];
      
      spow[trasa[i][0] - 1] += 1;
      rspow[trasa[i][1] - 1] += 1;
   }
   
   spow[0] = 0;
   rspow[0] = 0;
   for(int i=1; i<n; i++)
	{
      spow[i] = spow[i-1] + mm[i-1];
      rspow[i] = rspow[i-1] + rmm[i-1];
   }

//Przeszukiwanie grafu
   
   //usuwanie nadprogramowych skrzyżowań
   queue <int> kolejka;
   int ilusun = 0;
   
   for (int i=0; i<n; i++)
   {
      if (rmm[i]==0)              //jeżeli ilość połączeń jest mniejsza od wymaganej liczby dróg...
      {
         ilusun++;
         wynik[i] = -1;
         kolejka.push(i+1);      //dodanie do kolejki, aby potem sprawdzić, z jakimi miastami jest powiązana
      }
      else
         wynik[i] = 0;
   }
   
   int a, b;
   while (!kolejka.empty())
   {
        a = kolejka.front() - 1;
        for (int i=0; i<mm[a];i++)
        {
            b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
            if (wynik[b] == 0)
            {
               rild[b]--; 
               if (rild[b] == 0)
               {
                  ilusun++;
                  wynik[b] = -1;
                  kolejka.push(b+1);
               }
            }
        }       
        kolejka.pop();
   }

   for (int i=0; i<n; i++)
   {
      if (wynik[i] != 0)
         continue;
      if (mm[i]==0 )              //jeżeli ilość połączeń jest mniejsza od wymaganej liczby dróg...
      {
         wynik[i] = -1;
         ilusun++;
         kolejka.push(i+1);      //dodanie do kolejki, aby potem sprawdzić, z jakimi miastami jest powiązana
      }
   }

   while (!kolejka.empty())
   {
        a = kolejka.front() - 1;
        for (int i=0; i<rmm[a];i++)
        {
            b = rpowm[rspow[a]+i] - 1; //indeks sprawdzanego miasta
            if (wynik[b] == 0)
            {
               ild[b]--; 
               if (ild[b] == 0)
               {
                  ilusun++;
                  wynik[b] = -1;
                  kolejka.push(b+1);
               }
            }
        }       
        kolejka.pop();
   }
   
   if(ilusun == n)//usuniete wszytskie skrzyzowania
   {
      cout<<"NIE";
      return 0;
   }

/*   //w grafie zostały tylko cykle, sprawdzamy czy wszytskie są w jednej grupie
   for (int i=0; i<n; i++)
   {
      if (wynik[i] != 0)
         continue;
         
      ilusun++;
      wynik[i] = 1;
      kolejka.push(i+1);      //dodanie do kolejki, aby potem sprawdzić, z jakimi miastami jest powiązana
      break;
   }

   while (!kolejka.empty())
   {
      a = kolejka.front() - 1;
      for (int i=0; i<mm[a];i++)
      {
         b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
         if (wynik[b] == 0)
         {
            ilusun++;
            wynik[b] = 1;
            kolejka.push(b+1);
         }
      }       
      kolejka.pop();
   }

   if(ilusun != n)
   {
      cout<<0<<endl;
      return 0;
   }
   */

   //szukamy cyklu
   int poczatek = -1;
   for (int i=0; i<n; i++)
   {
      if (wynik[i] == 0)
      {
         poczatek = i;
         break;
      }
   }
   
   for(int a = poczatek; wynik[a] == 0;)
   {
      //cout<<"a = "<<a<<endl;
      wynik[a] = 2;
      for (int i=0; i<mm[a];i++)
      {
         b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
         if (wynik[b] == 0) //nieodwiedzane skrzyzowanie
         {
            a = b;
            break;
         }
         if(wynik[b] == 2)//skrzyzowanie na cyklu
         {
            poczatek = b;
         }
      }
   }
   //cout<<"cykl"<<endl;
   //oznaczamy cykl
   int ilkry = 0;
   for(a = poczatek; wynik[a] != 3; ilkry++)
   {
      //cout<<a<<endl;
      krykol[a] = ilkry;
      wynik[a] = 3;
      for (int i=0; i<mm[a];i++)
      {
         b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
         if (wynik[b] == 2) //nieodwiedzane skrzyzowanie
         {
            a = b;
            break;
         }
      }
   }
   //cout<<"wyniki"<<endl;
   //
   //for (int i=0; i<n; i++)
   //   cout<<wynik[i]<<" "; 
//cout<<"dl cyklu: "<<ilkry<<endl;
   dlcykl = ilkry;
   int niekas = -1;
   stack <int> stos;
   for(a = poczatek; wynik[a] != 4 && wynik[a] != 5;) //4 cykl obejdziony
   {
      if(niekas == a)
         niekas = -1;
      if(niekas != -1)
      {
         //cout<<"usuwanie: "<<a<<endl;
         if(wynik[a] != 5)
            ilkry--;
         wynik[a] = 5;
      }
      else
         wynik[a] = 4; //oznaczamy jako 4 żeby przejść cykl dokładnie raz
      stos.push(a+1);
      //cout<<"stos start"<<endl;
      while(!stos.empty())
      {
         int aa = stos.top() - 1;
         //cout<<"aa = "<<aa + 1<<endl;
         for (int i=0; i<mm[aa];i++)
         {
            b = powm[spow[aa]+i] - 1; //indeks sprawdzanego miasta
            //cout<<"\tb = "<<b + 1<<endl;
            if (wynik[b] >= 0 && wynik[b] <= 2)
            {
               
               wynik[b] = 9;
               stos.push(b+1);
            }
            else if(wynik[b] >= 3 && wynik[b] <= 5) //sasiad krytyk
            {
               if(odleg(a, b) > odleg(a, niekas))
               {
                  //cout<<"usun od: "<<a<<" do: "<<b<<endl;
                  niekas = b;
               }
            }
            else if(wynik[b] == 9) //cykl niezalezny
            {
               cout<<0<<endl;
               return 0;
            }
         }
         if(aa == stos.top() - 1)
         {
            if(stos.size() > 1)
               wynik[aa] = 10;
            stos.pop();
         }
      }
      
      //szukamy nastepnego elementu cyklu
      for (int i=0; i<mm[a];i++)
      {
         b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
         if (wynik[b] == 3) //nieodwiedzane skrzyzowanie
         {
            a = b;
            break;
         }
      }
   }
   while(a != niekas && niekas != -1)
   {
      if(wynik[a] != 5)
         ilkry--;
      //cout<<"usuwanie po: "<<a<<endl;
      wynik[a] = 5;
      //szukamy nastepnego elementu cyklu
      for (int i=0; i<mm[a];i++)
      {
         b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
         if (wynik[b] == 4 || wynik[b] == 5) //nieodwiedzane skrzyzowanie
         {
            a = b;
            break;
         }
      }
   }
   //cout<<"wyniki"<<endl;
   
   //for (int i=0; i<n; i++)
   //   cout<<wynik[i]<<" ";   
      
   for(int i = 0; i < n; i++)
   {
      a = i;
      if(wynik[a] < 0 || wynik[a] > 2)
         continue;
         
      wynik[a] = 9;
      stos.push(a+1);
      //cout<<"start :"<<a<<endl;
      
      while(!stos.empty())
      {
         int aa = stos.top() - 1;
         //cout<<"top "<<aa<<endl;
         
         for (int i=0; i<mm[aa];i++)
         {
            b = powm[spow[aa]+i] - 1; //indeks sprawdzanego miasta
            if (wynik[b] >= 0 && wynik[b] <= 2)
            {
               wynik[b] = 9;
               stos.push(b+1);
            }
            else if(wynik[b] == 9) //cykl niezalezny
            {
               cout<<0<<endl;
               return 0;
            }
         }
         if(aa == stos.top() - 1)
         {
            if(stos.size() > 1)
               wynik[aa] = 10;
            stos.pop();
         }
      }
   }

   cout<<ilkry<<endl;
   for(int i = 0; i < n; i++)
   {
      if(wynik[i] == 4)
         cout<<i + 1<<" ";
   }
//cin >>n;

  /*
   //utworzenie stosu
   stack <int> stos;
   stack <int> stos2;
   stack.push(1);
   
   //chodzenie po grafie
   
   int a;   
   while (!stos.empty())
   {
      a = mm[i];
      if (powm[a] == 1)
      if (wynik[powm[a]] == -1)              //jeżeli byliśmy na danym skrzyżowaniu, cofamy się
         stack.pop();
      else
         stack.push(powm[a]);
      
         
      
      
      wynik[powm[a]] +=1;
      
      
      
      mm[i]++;
      
      
      
      
      
      
      i = x;
   }   
   
   
   
   
   
   while (!kolejka.empty())
   {
        a = kolejka.front() - 1;
        for (int i=0; i<mm[a];i++)
        {
            b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
            if (wynik[b] == 0)
            {
               ild[b]--; 
               if (ild[b] < d)
               {
                  wynik[b] = -1;
                  kolejka.push(b+1);
               }
            }
        }       
        kolejka.pop();
   }
   

   
   
   
   
   
   //tworzenie kolejki   
   queue <int> kolejka;
   
   for (int i=0; i<n; i++)
   {
      if (ild[i] < d)               //jeżeli ilość połączeń jest mniejsza od wymaganej liczby dróg...
      {
         wynik[i] = -1;
         kolejka.push(i+1);      //dodanie do kolejki, aby potem sprawdzić, z jakimi miastami jest powiązana
      }
      else
         wynik[i] = 0;
   }
   
   //obsługa kolejki
   int a, b;
   while (!kolejka.empty())
   {
        a = kolejka.front() - 1;
        for (int i=0; i<mm[a];i++)
        {
            b = powm[spow[a]+i] - 1; //indeks sprawdzanego miasta
            if (wynik[b] == 0)
            {
               ild[b]--; 
               if (ild[b] < d)
               {
                  wynik[b] = -1;
                  kolejka.push(b+1);
               }
            }
        }       
        kolejka.pop();
   }
   
//Łączenie w zbiory
   int maxEl = 0;
   int maxZb = 0;
   
   for (int i=0; i<n; i++)
   {
      if (wynik[i] == 0)
      {
         wynik[i] = i+1;
         kolejka.push(i+1);
         
         int akEl = 1;
         
         while (!kolejka.empty())
         {
            a = kolejka.front() - 1;
            for (int j=0; j<mm[a];j++)
            {
               b = powm[spow[a]+j] - 1; //indeks sprawdzanego miasta
               if (wynik[b] == 0)
               {
                  wynik[b] = i+1;
                  kolejka.push(b+1);
                  akEl++;
               }
            }       
            kolejka.pop();
         }
         
         if(maxEl < akEl)
         {
            maxEl = akEl;
            maxZb = i+1;
         }
      }
   }

//Wypisywanie
   if (maxEl == 0)
      cout<<"NIE";
   else
   {
      cout<<maxEl<<endl;
      
      for (int i=0; i<n; i++)
      {
         if (wynik[i] == maxZb)
            cout<<i+1<<" ";
      }
   }*/
}
