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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<vector>
#include<algorithm>
#include<cctype>
#include<utility>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<climits>
#include<bitset>
#include<stack>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)

using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<ll, ll, ll, ll> lltpl;



/******************************************************************************************/


const int IINF = 1e9 + 7;
const ll LINF = 1e18 + 7;
const ll MOD = 1e9 + 7;



template<typename T>
vector<T> make_v(size_t a) { return vector<T>(a); }
template<typename T, typename... Ts>
auto make_v(size_t a, Ts... ts) {
	return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}
template<typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type
fill_v(T& t, const V& v) { t = v; }
template<typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type
fill_v(T& t, const V& v) {
	for (auto& e : t) fill_v(e, v);
}

//グラフの隣接リスト
vector<int> g[1010];
//頂点の入次数を管理
int h[1010];

int out[1010];

bool used[1010];
vector<int> uku;
bool exist = false;

void dfs(int parent, int now) {

	used[now] = 1;
	uku.push_back(now);
		
	for (auto itr : g[now]) {

		if (itr == parent) {
			exist = true;
			//閉路発見
			return;
		}
		if (!used[itr]) {
			dfs(parent, itr);
		}
	}
	if (exist) {
		return;
	}
	uku.pop_back();
	
}




int main() {

	cin.tie(nullptr);
	ios::sync_with_stdio(false);

	//頂点数v、辺の数e
	int v, e;
	cin >> v >> e;
	REP(i, e) {
		int s, t;
		cin >> s >> t;
		s--;
		t--;
		//頂点sから頂点tへの有向辺
		g[s].push_back(t);
		h[t]++;
		out[s]++;
	}

	//入次数が0の頂点の集合
	stack<int> st;
	vector<int> tapi;

	//入次数が0の頂点であればstに追加
	REP(i, v) {
		if (h[i] == 0) {
			st.push(i);
		}
		if (h[i] == 1) {
			tapi.push_back(i);
		}
	}

	//ソートされた後のグラフ
	vector<int> ans;
	//stがなくなるまでループ
	while (st.size()) {
		//stの集合のから一つ取り出す
		int i = st.top(); st.pop();
		ans.push_back(i);
		for (auto& j : g[i]) {
			//隣接する頂点の入次数をマイナス1
			h[j]--;
			//これによって入次数が0になればstに追加
			if (h[j] == 0) st.push(j);
		}
	}

	if (ans.size() == v) {
		cout << "-1" << endl;
		return 0;
	}
	

	

	for (int i = 0; i < tapi.size(); i++)
	{
		//tapi[i]は入次数が1の頂点
		for (int j = 0; j < 1010; j++)
		{
			used[i] = 0;
		}
		if (h[i] > 0 && out[i] > 0) {
			
			dfs(i, i);
		}
		if (exist) {
			break;
		}
	}

	cout << uku.size() << endl;
	for (auto itr : uku) {
		cout << itr + 1 << endl;
	}







}