#include <bits/stdc++.h>
using namespace std;
using ll = long long; using ull = unsigned long long;
// #define int ll
// #define DEBUG 42
inline void nprint(){}
template <class Head, class... Tail>
inline void nprint(Head &&head, Tail &&... tail) {
    cout << head << endl;
    nprint(move(tail)...);
}
#ifdef DEBUG
  #define eprint(...) nprint(__VA_ARGS__)
#else
  #define eprint(...) if(0==1) cout << 1 << endl;
#endif
#define Yes(a) cout << (a ? "Yes" : "No") << endl
#define YES(a) cout << (a ? "YES" : "NO") << endl
#define POSSIBLE(a) cout << (a ? "POSSIBLE" : "IMPOSSIBLE") << endl
using cmp = complex<double>;
using vb = vector<bool>; using vvb = vector<vb>;
using vi = vector<int>; using vvi = vector<vi>;
using vl = vector<ll>; using vvl = vector<vl>;
template<class T> using V = vector<T>;
template<class T> using VV = vector<V<T>>;
#define fi first
#define se second
#define maxs(x,y) (x=max<ll>(x,y))
#define mins(x,y) (x=min<ll>(x,y))
using pii = pair<int,int>; using pll = pair<ll,ll>;
#define FOR(i,a,b) for(ll i = (a); i < (ll)(b); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORS(i,a,b) FOR(i,a,b+1)
#define REPS(i,n) REP(i,n+1)
#define RFOR(i,a,b) for(ll i = (ll)(b)-1;i >= a;--i)
#define RREP(i,n) RFOR(i,0,n)
#define RREPS(i,n) RREP(i,n+1)
#define RFORS(i,a,b) RFOR(i,a,b+1)
#define ALL(obj) (obj).begin(), (obj).end()
#define RALL(obj) (obj).rbegin(), (obj).rend()
#define PERM(c) sort(ALL(c)); for(bool cp = true;cp;cp = next_permutation(ALL(c)))
#define eb(val) emplace_back(val)
inline ll bitcnt(ll val) { return __builtin_popcountll(val); }
const long double PI = std::acos(-1.0l);
constexpr int dx[] = {1,0,-1,0}; constexpr int dy[] = {0,1,0,-1};
template<typename Tail> auto type_vector(Tail&& tail){return tail;}
template<typename Head, typename... Tail> auto type_vector(Head&& head, Tail&&... tail){
  head = 0; return vector<decltype(type_vector(tail...))>(head);
}
template<typename Tail> auto make_vector(Tail&& tail){return tail;}
template<typename Head, typename... Tail> auto make_vector(Head&& head, Tail&&... tail){
  return vector<decltype(type_vector(tail...))>(head, make_vector(tail...));
}
template<typename T1, typename T2> ostream& operator<<(ostream& s, const pair<T1, T2>& p){
  return s << "(" << p.first << ", " << p.second << ")";
}
template<class T> istream& operator>>(istream &is,vector<T> &st){
  for(size_t i=0;i<st.size();++i){is >> st[i];} return is;
}
template<class T> istream& operator>>(istream &is,vector<vector<T>> &st){
  for(size_t i=0;i<st.size();++i){is >> st[i];} return is;
}
template<class T> ostream& operator<<(ostream &os, const vector<T> &st){
  for(size_t i=0;i<st.size();++i) os << st[i] << (i!=st.size()-1?" ":"");
  return os;
}
ostream& operator<<(ostream &os, const vector<string> &st){
  for(size_t i=0;i<st.size();++i) os << st[i] << (i!=st.size()-1?"\n":"");
  return os;
}
template<class T> ostream& operator<<(ostream &os, const vector<vector<T>> &st){
  for(size_t i=0;i<st.size();++i) os << st[i] << (i!=st.size()-1?"\n":"");
  return os;
}
constexpr double EPS = 1e-10;
constexpr ll MOD = 1E9+7;
// constexpr ll MOD = 998244353;
vvi gr;
vb seen;
vb finished;
vi hist;
int pos = -1;
bool dfs(int cur){
  seen[cur] = true;
  hist.eb(cur);
  for(auto&& e:gr[cur]){
    if(finished[e]) continue;
    if(seen[e]) {
      pos = e;
      return true;
    }
    dfs(e);
    if(pos != -1) return true;
  }
  hist.pop_back();
  finished[cur] = true;
  return false;
}

signed main(){
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  int n,m;
  cin >> n >> m;
  gr.assign(n,vi());
  seen.assign(n,false);
  finished.assign(n,false);
  REP(i,m){
    int a,b;
    cin >> a >> b;
    --a,--b;
    gr[a].eb(b);
  }
  vi ans;
  int start = 0;
  while(!dfs(start)){
    start++;
    if(start == n){
      cout << -1 << endl;
      return 0;
    }
  }
  while(!hist.empty()){
    int t = hist.back();
    hist.pop_back();
    ans.eb(t);
    if(t == pos) break;
  }
  assert(ans.size() > 1u);
  set<int> st(ALL(ans));
  vi mx(n+2);
  vvi gr2(n);
  REP(i,n)if(st.count(i))for(auto&& e:gr[i]){
    if(st.count(e)) gr2[i].eb(e);
  }
  swap(gr,gr2);

  for(auto&& a:ans){
    vi tmp;
    queue<pair<int,vi>> q;
    vb used(gr.size(), false);
    q.emplace(a,vi{a});
    while(!q.empty()){
      auto cur = q.front();
      q.pop();
      if(cur.first == a && cur.second.size() > 1u){
        cur.second.pop_back();
        tmp = move(cur.second);
        break;
      }
      if(used[cur.first]) continue;
      used[cur.first] = true;

      for(auto&& e:gr[cur.first]){
        cur.second.eb(e);
        q.emplace(e,cur.second);
        cur.second.pop_back();
      }
    }
    if(tmp.size() < mx.size()){
      mx = move(tmp);
    }
  }
  ans = move(mx);
  for_each(ALL(ans), [](int &i){++i;});
  if(ans.size() > (ull)n){cout << -1 << endl; return 0;}
  cout << ans.size() << endl;
  REP(i,ans.size()){
    cout << ans[i] << '\n';
  }
}

Measured memory_bytes: 4068