#include <iostream>
#include <vector>
#include <queue>
#include <cstdlib>
#include <ctime>
#include <set>
#include <stack>

using namespace std;

bool nic=false;
bool znaleziono=false;
set <int> niepewne, nowe;
stack<int> stos;
bool *odwiedzone;
bool * wyeksploatowany;

vector<int> *drogi_z;
vector<int> *drogi_do;

void zebranie_cyklu(int x){
    while(stos.top()!=x){
        nowe.insert(stos.top());
        stos.pop();
    }
    nowe.insert(stos.top());
    stos.pop();
    if(!znaleziono){
        znaleziono=true;
        niepewne=nowe;
    }
    else{
        set<int>::iterator it2;
        for(set<int>::iterator it=niepewne.begin(); it!= niepewne.end(); ){
            if(nowe.find(*it)==nowe.end()){
                it2=it;
                it++;
                niepewne.erase(niepewne.find(*it2));
            }
            else it++;
        }
        if(niepewne.size()==0) nic=true;
    }
    nowe.clear();
    while(!stos.empty())stos.pop();
}

void dfs(int i){
    //cout << "odpalony " << i+1 << endl;
    srand (time(NULL));
    stos.push(i);
    odwiedzone[i]=true;
    int mozliwe_wybory=drogi_z[i].size();

    for(int j=0; j<mozliwe_wybory; j++){
        if(niepewne.find(drogi_z[i][j])==niepewne.end()){
            if(odwiedzone[drogi_z[i][j]]) zebranie_cyklu(drogi_z[i][j]);
            else dfs(drogi_z[i][j]);
            return;
        }
    }

    int wybor=rand()%mozliwe_wybory;
    if(odwiedzone[drogi_z[i][wybor]]) zebranie_cyklu(drogi_z[i][wybor]);
    else dfs(drogi_z[i][wybor]);

}

int main()
{
    srand (time(NULL));
    int n, m, a, b;
    int V, E;
    cin >> n >> m;
    odwiedzone= new bool[n];
    drogi_do= new vector<int>[n];
    drogi_z= new vector<int>[n];
    V=n;
    int * ile_do = new int[n];
    int * ile_z = new int [n];
    queue <int> Q;
    for(int i=0; i<n; ++i){ //nauczylem sie preinkrementacji, pierwsze zastosowanie, jeszcze tylko zmieniæ nawyki :D
        ile_z[i]=0;
        ile_do[i]=0;
    }
    for(int i=0; i<m; ++i){
        cin >> a >> b;
        --a;
        --b;
        drogi_z[a].push_back(b);
        ++ile_z[a];
        drogi_do[b].push_back(a);
        ++ile_do[b];
    }
    for(int i=0; i<n; ++i){
        if(ile_z[i]==0 || ile_do[i]==0){
            ile_z[i]=ile_do[i]=0;
            Q.push(i);
            V--;
        }
    }
    int usuwany;
    vector<int>::iterator it;
    while(!Q.empty()){
        usuwany=Q.front();
        for( it = drogi_z[usuwany].begin(); it!=drogi_z[usuwany].end(); ++it){
            --ile_do[*it];
            if(ile_do[*it]==0){
                ile_z[*it]=0;
                Q.push(*it);
                V--;
            }
        }
        for( it = drogi_do[usuwany].begin(); it!=drogi_do[usuwany].end(); ++it){
            --ile_z[*it];
            if(ile_z[*it]==0){
                ile_do[*it]=0;
                Q.push(*it);
                V--;
            }
        }
        Q.pop();
    }
    if(V==0){
        cout << "NIE";
        return 0;
    }
    E=0;
    for(int i=0; i<n; i++){
        if(ile_do[i]<1) ile_do[i]=0;
        else E += ile_do[i];
    }
    //cout << "test\n";
    //usuwanie krawedzi do nikad
    for(int i=0; i<n; ++i)
        if(ile_do[i]!=0){
            for(int j=0; j<drogi_do[i].size(); j++){
                if(ile_do[drogi_do[i][j]]==0){
                    drogi_do[i][j]=drogi_do[i][drogi_do[i].size()-1];
                    drogi_do[i].resize(drogi_do[i].size()-1);
                }
            }
            for(int j=0; j<drogi_z[i].size(); j++){
                if(ile_do[drogi_z[i][j]]==0){
                    drogi_z[i][j]=drogi_z[i][drogi_z[i].size()-1];
                    drogi_z[i].resize(drogi_z[i].size()-1);
                }
            }
        }

    //cout << "test\n";
/*
    for(int i=0; i<n; ++i){
        //cout << i << ": ";
        if(ile_do[i]<1);// cout << "-";
        else{
            //cout << ile_z[i];
            cout << i+1  << ": ";
            for(it=drogi_z[i].begin(); it!=drogi_z[i].end(); ++it) cout<< *it + 1 << " ";

            cout << endl;
        }
    }
    cout << endl << endl;*/
    int xx, j, i;
    j = xx =0;
    i=rand()%n;
    while(j<200){
        if(ile_do[i]!=0){
            for(int z=0; z<n; z++)odwiedzone[z]=false;
           // cout << "dfs dla " << i+1;
            dfs(i);
            j++;

            i=rand()%n;
            //cout << "test\n";
        }
        i = (i+1)%n;
        if(nic) break;
    }
    cout << niepewne.size() << endl;
    for(set<int>::iterator it=niepewne.begin(); it!=niepewne.end(); it++){
        cout << *it +1 << " ";
    }
    cout << endl;


    return 0;
}
