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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		E = new List<int>[N];
		for(int i=0;i<N;i++){
			E[i] = new List<int>();
		}
		Mp = new int[N][];
		for(int i=0;i<N;i++){
			Mp[i] = new int[N];
			for(int j=0;j<N;j++){
				Mp[i][j] = -1;
			}
		}
		
		for(int i=0;i<M;i++){
			E[A[i]].Add(B[i]);
			Mp[A[i]][B[i]] = i;
		}
		
		compo = new int[N];
		for(int i=0;i<N;i++) compo[i] = -1;
		L = null;
		
		int cmp = 0;
		for(int i=0;i<N;i++){
			if(compo[i] != -1) continue;
			cmp++;
			var a = new List<int>();
			a.Add(i);
			var hs = new HashSet<int>();
			hs.Add(i);
			compo[i] = cmp;
			dfs(cmp, a, hs);
		}
		if(L == null){
			Console.WriteLine(-1);
			return;
		}
		
		List<int> l = new List<int>(L);
		while(true){
			
			var di = new Dictionary<int, int>();
			for(int i=0;i<l.Count;i++){
				di.Add(l[i], l[(i + 1) % l.Count]);
			}
			int edx = -1;
			
			for(int i=0;i<M;i++){
				if(di.ContainsKey(A[i]) && di.ContainsKey(B[i])){
					if(di[A[i]] != B[i]){
						edx = i;
						break;
					}
				}
			}
			if(edx == -1){
				Console.WriteLine(l.Count);
				Console.WriteLine(String.Join("\n",l.Select(n => n + 1)));
				return;
			}
			
			di[A[edx]] = B[edx];
			var nl = new List<int>();
			nl.Add(A[edx]);
			nl.Add(B[edx]);
			while(true){
				int nxt = di[nl[nl.Count - 1]];
				if(nxt == nl[0]) break;
				nl.Add(nxt);
			}
			
			l = nl;
		}
		
	}
	
	int[][] Mp;
	List<int>[] E;
	List<int> L;
	int[] compo;
	void dfs(int cmp, List<int> a, HashSet<int> hs){
		if(L != null) return;
		int now = a[a.Count - 1];
		foreach(var nxt in E[now]){
			if(compo[nxt] == -1){
				a.Add(nxt);
				hs.Add(nxt);
				compo[nxt] = cmp;
				dfs(cmp, a, hs);
				a.RemoveAt(a.Count -1);
				hs.Remove(nxt);
			} else if(compo[nxt] == cmp){
				if(hs.Contains(nxt)){
					L = new List<int>(a);
				}
				return;
			} else {
				return;
			}
		}
	}
	
	int N, M;
	int[] A,B;
	public Sol(){
		var d = ria();
		N = d[0]; M = d[1];
		A = new int[M];
		B = new int[M];
		for(int i=0;i<M;i++){
			d = ria();
			A[i] = d[0] - 1;
			B[i] = d[1] - 1;
		}
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}