#include <algorithm>
#include <array>
#include <assert.h>
#include <chrono>
#include <bitset>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <random>
#include <queue>
#include <set>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<double> vd;
typedef vector<bool> vb;
typedef vector<string> vs;
typedef vector<ld> vld;
typedef vector<vector<int>> vvi;
typedef vector<ll> vl;
typedef vector<vector<ll>> vvl;
typedef vector<vector<ld>> vvd;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector<pll> vpll;

#ifdef OLBOEB
  mt19937 rnd(228 + 1488 + 238 + 24111997 % 322);
#else
  mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif

void print_time() {
#ifdef OLBOEB
    cout.flush();
    cerr << "\ntime: " << clock() * 1.0 / CLOCKS_PER_SEC << endl;
#endif
}

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()

template<class T1, class T2>
ostream& operator<< (ostream &out, pair<T1, T2> pair) { return out << "(" << pair.first << ", " << pair.second << ")";}
template<class T> ostream& operator<<(ostream& out, vector<T> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }
template<class T> ostream& operator<<(ostream& out, set<T> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }
template<class L, class R> ostream& operator<<(ostream& out, map<L, R> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }


void upd(ll& x, ll y) { x = min(x, y); }

const ll MAXN = 1e3 + 228;
const ll MAXM = 2e3 + 228;
const ll INF = 1e9;

ll n, m;
vl g[MAXN];

vl kNoCycle = {};
vl get_min_cycle() {
    vvl d(n, vl(n, INF));
    for (ll v = 0; v < n; ++v) {
        for (ll u : g[v]) d[v][u] = 1;
    }
    for (ll k = 0; k < n; ++k) {
        for (ll v = 0; v < n; ++v) {
            for (ll u = 0; u < n; ++u) {
                upd(d[v][u], d[v][k] + d[k][u]);
            }
        }
    }

    ll ans = INF;

    for (ll v = 0; v < n; ++v) {
        upd(ans, d[v][v]);
    }
    if (ans == INF) return kNoCycle;

    for (ll v = 0; v < n; ++v) {
        if (d[v][v] != ans) continue;
        ll start = v;
        vl cycle = { start };
        for (ll i = 0; i < ans - 1; ++i) {
            for (ll u : g[v]) {
                if (d[u][start] == (ans - 1 - i)) {
                    cycle.pb(u);
                    v = u;
                    break;
                }
            }
        }
        return cycle;
    }
    assert(false);
    return kNoCycle;
}

int main() {
    cout << fixed << setprecision(30);
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    cin >> n >> m;
    for (ll i = 0; i < m; ++i) {
        ll v, u;
        cin >> v >> u;
        --v, --u;
        g[v].pb(u);
    }

    vl ans = get_min_cycle();
    if (!sz(ans)) {
        cout << -1 << endl;
    } else {
        cout << sz(ans) << endl;
        for (ll v : ans) cout << (v + 1) << "\n";
        cout << endl;
    }

    print_time();
    return 0;
}




Measured memory_bytes: 10240