#include <bits/stdc++.h>
using namespace std;

// vector<vector<int>> G;
// vector<vector<int>> Ginv;
// vector<int> seen;
using Graph = vector<vector<int>>;

// 探索
vector<bool> seen, finished;

// サイクル復元のための情報
int pos = -1; // サイクル中に含まれる頂点 pos
stack<int> hist; // 訪問履歴

void dfs(const Graph &G, int v, int p) {
    seen[v] = true;
    hist.push(v);
    for (auto nv : G[v]) {
        if (nv == p) continue; // 逆流を禁止する

        // 完全終了した頂点はスルー
        if (finished[nv]) continue;

        // サイクルを検出
        if (seen[nv] && !finished[nv]) {
            pos = nv;
            return;
        }

        // 再帰的に探索
        dfs(G, nv, v);

        // サイクル検出したならば真っ直ぐに抜けていく
        if (pos != -1) return;
    }
    hist.pop();
    finished[v] = true;
}

void solve(long long N, long long M, std::vector<long long> A, std::vector<long long> B){
    Graph G(N);
    for(int i=0;i<M;++i){
        G[A[i]-1].push_back(B[i]-1);
    }

    // 探索
    seen.assign(N, false), finished.assign(N, false);
    for(int i = 0;i<N;++i)if(!seen[i]){
        pos = -1;
        dfs(G, i, -1);

        // サイクルを復元
        if(!hist.empty()){
            set<int> cycle;
            while (!hist.empty()) {
                int t = hist.top();
                cycle.insert(t);
                hist.pop();
                // cout<<t<<endl;
                if (t == pos) break;
            }
            while(true){
                Graph G1(N), G2(N);
                int a1 = -1, a2 = -1;
                for(int v:cycle){
                    for(int u:G[v]){
                        if(cycle.find(u)!=cycle.end()){
                            G1[v].push_back(u);
                            G2[u].push_back(v);
                            // if(G1[v].size()>1&&G2[u].size()>1){
                            //     a1 = v;
                            //     a2 = u;
                            // }
                        }
                    }
                }
                for(int v:cycle){
                    for(int u:G1[v]){
                        if(G1[v].size()>1&&G2[u].size()>1){
                            a1 = v;
                            a2 = u;
                        }
                        if(a1 != -1) break;
                    }
                    if(a1 != -1) break;
                }
                if(a1 == -1)break;
                cycle = set<int>();
                cycle.insert(a1);
                a1 = a2;
                while(cycle.find(a1)==cycle.end()){
                    cycle.insert(a1);
                    a1=G1[a1][0];
                }
            }
            cout<<cycle.size()<<endl;
            for(auto v:cycle){
                cout<<v+1<<endl;
            }
            return;
        }
    }
    cout<<-1<<endl;
}

// Generated by 1.1.4 https://github.com/kyuridenamida/atcoder-tools  (tips: You use the default template now. You can remove this line by using your custom template)
int main(){
    long long N;
    scanf("%lld",&N);
    long long M;
    scanf("%lld",&M);
    std::vector<long long> A(M);
    std::vector<long long> B(M);
    for(int i = 0 ; i < M ; i++){
        scanf("%lld",&A[i]);
        scanf("%lld",&B[i]);
    }
    solve(N, M, std::move(A), std::move(B));
    return 0;
}


Measured memory_bytes: 512