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.Generic;
using System.Linq;

public class Program
{
    private int N, M;
    private HashSet<int>[] Edge;

    private bool[] F;
    private bool[] Searched;


    public void Solve()
    {
        var sc = new Scanner();
        N = sc.NextInt();
        M = sc.NextInt();
        Edge = new HashSet<int>[N];
        for (int i = 0; i < N; i++)
        {
            Edge[i] = new HashSet<int>();
        }

        for (int i = 0; i < M; i++)
        {
            int a = sc.NextInt() - 1;
            int b = sc.NextInt() - 1;
            Edge[a].Add(b);
        }

        F = new bool[N];
        Searched = new bool[N];
        S = new Stack<int>();

        // ループ取得

        bool f = false;

        for (int i = 0; i < N; i++)
        {
            if (!Searched[i])
            {
                if (Search(i))
                {
                    f = true;
                    break;
                }
            }
        }

        if (!f)
        {
            Console.WriteLine(-1);
            return;
        }

        List<int> loop = new List<int>();
        var tmp = S.ToArray();

        int index = Array.IndexOf(tmp, Num);
        Console.WriteLine(index);
        Console.WriteLine(string.Join(" ", tmp));
        for (int i = 0; i <= index; i++)
        {
            loop.Add(tmp[i]);
        }

        loop.Reverse();

        while (true)
        {
            int b, e;
            if (Check(loop, out b, out e))
            {
                break;
            }

            int ind = loop.IndexOf(e);
            var next = new List<int>();
            for (int i = 0; i < loop.Count; i++)
            {
                int ii = (i + ind) % loop.Count;
                next.Add(loop[ii]);
                if(loop[ii] == b)
                    break;
            }

            loop = next;
        }
        
        Console.WriteLine(loop.Count);
        Console.WriteLine(string.Join("\n",loop.Select(i=>i+1)));
    }

    // lが条件を満たすか b 満たさなかったとき start b end e
    private bool Check(List<int> l, out int b, out int e)
    {
        var hs = new HashSet<int>();
        foreach (int i in l)
        {
            hs.Add(i);
        }

        for (int i = 0; i < l.Count; i++)
        {
            int next = (i + 1) % l.Count;
            foreach (int i1 in Edge[l[i]])
            {
                if (l[next] != i1 && hs.Contains(i1))
                {
                    b = l[i];
                    e = i1;
                    return false;
                }
            }
        }

        b = -1;
        e = -1;
        return true;
    }

    private int Num;

    private Stack<int> S;

    private bool Search(int i)
    {
        F[i] = true;
        S.Push(i);
        foreach (int i1 in Edge[i])
        {
            if (F[i1])
            {
                Num = i1;
                return true;
            }

            if (Search(i1))
            {
                return true;
            }
        }

        S.Pop();
        F[i] = false;
        Searched[i] = true;
        return false;
    }


    public static void Main(string[] args)
    {
        new Program().Solve();
    }
}

class Scanner
{
    public Scanner()
    {
        _pos = 0;
        _line = new string[0];
    }

    const char Separator = ' ';
    private int _pos;
    private string[] _line;

    #region スペース区切りで取得

    public string Next()
    {
        if (_pos >= _line.Length)
        {
            _line = Console.ReadLine().Split(Separator);
            _pos = 0;
        }

        return _line[_pos++];
    }

    public int NextInt()
    {
        return int.Parse(Next());
    }

    public long NextLong()
    {
        return long.Parse(Next());
    }

    public double NextDouble()
    {
        return double.Parse(Next());
    }

    #endregion

    #region 型変換

    private int[] ToIntArray(string[] array)
    {
        var result = new int[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = int.Parse(array[i]);
        }

        return result;
    }

    private long[] ToLongArray(string[] array)
    {
        var result = new long[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = long.Parse(array[i]);
        }

        return result;
    }

    private double[] ToDoubleArray(string[] array)
    {
        var result = new double[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = double.Parse(array[i]);
        }

        return result;
    }

    #endregion

    #region 配列取得

    public string[] Array()
    {
        if (_pos >= _line.Length)
            _line = Console.ReadLine().Split(Separator);

        _pos = _line.Length;
        return _line;
    }

    public int[] IntArray()
    {
        return ToIntArray(Array());
    }

    public long[] LongArray()
    {
        return ToLongArray(Array());
    }

    public double[] DoubleArray()
    {
        return ToDoubleArray(Array());
    }

    #endregion
}