Problem:
Score : 600 points

Problem Statement

Given is a directed graph G with N vertices and M edges.

The vertices are numbered 1 to N, and the i-th edge is directed from Vertex A_i to Vertex B_i.

It is guaranteed that the graph contains no self-loops or multiple edges.

Determine whether there exists an induced subgraph (see Notes) of G such that the in-degree and out-degree of every vertex are both 1. If the answer is yes, show one such subgraph.

Here the null graph is not considered as a subgraph.

Notes

For a directed graph G = (V, E), we call a directed graph G' = (V', E') satisfying the following conditions an induced subgraph of G:

V' is a (non-empty) subset of V.

E' is the set of all the edges in E that have both endpoints in V'.

Constraints

1 \leq N \leq 1000

0 \leq M \leq 2000

1 \leq A_i,B_i \leq N

A_i \neq B_i

All pairs (A_i, B_i) are distinct.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
A_2 B_2
:
A_M B_M

Output

If there is no induced subgraph of G that satisfies the condition, print -1.
Otherwise, print an induced subgraph of G that satisfies the condition, in the following format:

K
v_1
v_2
:
v_K

This represents the induced subgraph of G with K vertices whose vertex set is \{v_1, v_2, \ldots, v_K\}. (The order of v_1, v_2, \ldots, v_K does not matter.)
If there are multiple subgraphs of G that satisfy the condition, printing any of them is accepted.

Sample Input 1

4 5
1 2
2 3
2 4
4 1
4 3

Sample Output 1

3
1
2
4

The induced subgraph of G whose vertex set is \{1, 2, 4\} has the edge set \{(1, 2), (2, 4), (4, 1)\}. The in-degree and out-degree of every vertex in this graph are both 1.

Sample Input 2

4 5
1 2
2 3
2 4
1 4
4 3

Sample Output 2

-1

There is no induced subgraph of G that satisfies the condition.

Sample Input 3

6 9
1 2
2 3
3 4
4 5
5 6
5 1
5 2
6 1
6 2

Sample Output 3

4
2
3
4
5

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#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;
  if(!dfs(0)){
    cout << -1 << endl;
    return 0;
  }
  while(!hist.empty()){
    int t = hist.back();
    hist.pop_back();
    ans.eb(t);
    if(t == pos) break;
  }
  set<int> st(ALL(ans));
  vi mx(n+2);
  vvi gr2(n);
  REP(i,n)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){
        // eprint(cur.second);
        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;});
  cout << ans.size() << endl;
  REP(i,ans.size()){
    cout << ans[i] << '\n';
  }
}