#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <climits>
#include <cstring>

#define rep(i, m, n) for(int i=int(m);i<int(n);i++)
#define all(c) begin(c),end(c)

template<typename T1, typename T2>
inline void chmin(T1 &a, T2 b) { if (a > b) a = b; }

template<typename T1, typename T2>
inline void chmax(T1 &a, T2 b) { if (a < b) a = b; }

typedef long long int ll;
using ll = long long int;
using ull = long long unsigned int;
using Int = long long int;
using namespace std;
#define INF (1 << 30) - 1
#define INFl (ll)5e15
#define DEBUG 0
#define dump(x)  cerr << #x << " = " << (x) << endl
#define MOD 1000000007


//edit
struct SCC {
    int V;
    vector<vector<int> > G;//グラフの隣接リスト表現
    vector<vector<int> > rG;//変の向きを逆にしたグラフ
    vector<int> vs;//帰りがけ順の並び
    vector<bool> used;//既に調べたか
    vector<int> cmp;//属する共連結成分のトポロジカル順序

    SCC(int v) {
        V = v;
        G.resize(V);
        rG.resize(V);
        used.resize(V);
        cmp.resize(V);
    }

    /**
     * 辺を貼る
     * @param from 辺の元
     * @param to 辺の先
     */
    void add_edge(int from, int to) {
        G[from].push_back(to);
        rG[to].push_back(from);
    }

    void dfs(int v) {
        used[v] = true;
        for (int i = 0; i < G[v].size(); i++) {
            if (!used[G[v][i]]) dfs(G[v][i]);
        }
        vs.push_back(v);
    }


    void rdfs(int v, int k) {
        used[v] = true;
        cmp[v] = k;
        for (int i = 0; i < rG[v].size(); i++) {
            if (!used[rG[v][i]]) rdfs(rG[v][i], k);
        }
    }

    int scc() {
        fill(used.begin(), used.end(), false);
        vs.clear();
        for (int v = 0; v < V; v++) {
            if (!used[v]) dfs(v);
        }
        fill(used.begin(), used.end(), false);
        int k = 0;
        for (int i = vs.size() - 1; i >= 0; i--) {
            if (!used[vs[i]]) rdfs(vs[i], k++);
        }
        return k;
    }
};

class Dijkstra {
public:
    using T = long long int;
    typedef pair<T, int> P; //firstは最短距離、secondは頂点の番号
    const T inf = (T) 5e15;
    struct edge {
        int to;
        T cost;
    };

    int V;                  //超点数
    vector<vector<edge>> G; //グラフ,G[i]はiから出る辺の集合,G[i][j]はiから出る辺のj番目の辺
    vector<T> d;           //最短距離
    vector<int> pv;
    vector<int> kumi;

    //0origin
    Dijkstra(int N) {
        V = N;
        G = vector<vector<edge >>(N);
        d = vector<T>(N);
        pv = vector<int>(N, -1);
        kumi = vector<int>(N, 0);
    };

    void dijkstra(int s) {
        priority_queue<P, vector<P>, greater<P>> que;
        fill(d.begin(), d.end(), inf);
        d[s] = 0;
        kumi[s] = 1;
        que.push(P(0, s));

        while (!que.empty()) {
            P p = que.top();
            que.pop();
            int v = p.second;
            if (d[v] < p.first)
                continue;
            for (int i = 0; i < G[v].size(); i++) {
                edge e = G[v][i];
                if (d[e.to] > d[v] + e.cost && !(d[e.to] == inf && d[v] == inf)) {
                    d[e.to] = d[v] + e.cost;
                    pv[e.to] = v;
                    kumi[e.to] = kumi[v];
                    que.push(P(d[e.to], e.to));
                } else if (d[e.to] == d[v] + e.cost && !(d[e.to] == inf && d[v] == inf)) {
                    if (kumi[e.to] + kumi[v] >= 2) {
                        kumi[e.to] = 2;
                    }
                }
            }
        }
    }

    /* 頂点fromに頂点toに達するコストcostの辺を貼る */
    void addEdge(int from, int to, T cost) {
        edge e;
        e.to = to;
        e.cost = cost;
        G[from].push_back(e);
    }

    T getDist(int v) {
        return d[v];
    }
};

class Solve {
public:
//    vector<vector<Int>> G;

    void solve() {
        Int N, M;
        cin >> N >> M;
        SCC scc(N);
        for (int i = 0; i < M; ++i) {
            int a, b;
            cin >> a >> b;
            a--, b--;
            scc.add_edge(a, b);
        }
        scc.scc();
        vector<set<Int>> tapi(N);
        for (int i = 0; i < N; ++i) {
            tapi[scc.cmp[i]].insert(i);
        }

        for (auto tapu : tapi) {
            if (tapu.size() >= 2) {
                //ここで探索をする
                for (auto S : tapu) {
                    if (S == 1) {
                        int aa = 2 + 2;
                    }
                    for (auto T : scc.G[S]) {
                        if (!tapu.count(T)) continue;
                        Dijkstra dij(N);
                        for (int i = 0; i < scc.G.size(); ++i) {
                            if (!tapu.count(i)) continue;
                            for (auto t :scc.G[i]) {
                                if (tapu.count(t) && !(i == S && t == T)) {
                                    dij.addEdge(i, t, 1);
                                }
                            }
                        }
                        dij.dijkstra(T);
                        if (dij.kumi[S] >= 2) continue;
                        vector<Int> ans;
                        ans.push_back(S);
                        while (ans.back() != T) {
                            ans.push_back(dij.pv[ans.back()]);
                        }

                        set<Int> anset(all(ans));

                        int cnt = 0;
                        for (int i = 0; i < scc.G.size(); ++i) {
                            for (auto t :scc.G[i]) {
                                if (tapu.count(t) && anset.count(i) && anset.count(t)) {
                                    cnt++;
                                }
                            }
                        }
                        if (cnt != ans.size()) continue;


                        cout << ans.size() << endl;
                        for (auto e : ans) {
                            cout << e + 1 << endl;
                        }
                        return;

                    }
                }
//                stack<Int> v;
//                vector<Int> path;
//                set<Int> visit;
//                vector<Int> neri(all(tapu));
//
//                v.push(neri[0]);
//
//                while (!v.empty()) {
//                    Int top = v.top();
//                    v.pop();
//
//                    if (!visit.count(top)) {
//                        v.push(top);
//                        path.push_back(top);
//                        visit.insert(top);
//                        for (auto nV : scc.G[top]) {
//                            if (tapu.count(nV)) {
//                                v.push(nV);
//                            }
//                        }
//                    } else {
//                        vector<Int> ans;
//                        int state = 0;
//                        for (auto e : path) {
//                            if (state == 0) {
//                                if (e == top) {
//                                    ans.push_back(e);
//                                    state = 1;
//                                }
//                            } else {
//                                ans.push_back(e);
//                            }
//                        }
//                        cout << ans.size() << endl;
//                        for (auto e : ans) {
//                            cout << e + 1 << endl;
//                        }
//                        return;
//                    }
//                }
            }
        }

        cout << -1 << endl;

    }
};


int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    Solve().solve();


    return 0;
}


Measured memory_bytes: 640