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: Accepted)

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using static System.Math;
using MethodImplOptions = System.Runtime.CompilerServices.MethodImplOptions;
using MethodImplAttribute = System.Runtime.CompilerServices.MethodImplAttribute;

public static class P
{
    public static void Main()
    {
        var n = NextInt;
        var m = NextInt;
        List<int>[] neighbours = Enumerable.Range(0, n).Select(_ => new List<int>()).ToArray();

        for (int i = 0; i < m; i++)
        {
            var a = NextInt - 1;
            var b = NextInt - 1;
            neighbours[b].Add(a);
        }

        Queue<State> queue = new Queue<State>();
        for (int i = 0; i < n; i++)
        {
            queue.Enqueue(new State() { Arrived = new ImmutableArray<bool>(n).SetValue(i, true), Route = new ImmutableStack<int>().Push(i) , Current = i });
        }
        
        while (queue.Count > 0)
        {
            var elem = queue.Dequeue();
            foreach (var neighbour in neighbours[elem.Current])
            {
                if (elem.Arrived[neighbour])
                {
                    var curStack = elem.Route;
                    List<int> res = new List<int>() { neighbour + 1 };
                    while (curStack.Top != neighbour)
                    {
                        res.Add(curStack.Top + 1);
                        curStack = curStack.Pop();
                    }
                    Console.WriteLine(res.Count);
                    Console.WriteLine(string.Join("\n", res));
                    return;
                }   
                queue.Enqueue(
                    new State()
                    {
                        Arrived = elem.Arrived.SetValue(elem.Current, true),
                        Current = neighbour,
                        Route = elem.Route.Push(neighbour)
                    }
                ); ;
            }
        }
        Console.WriteLine(-1);
    }
    static int NextInt
    {
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        get
        {
            int res = 0;
            int next = Console.In.Read();
            int sign = 1;
            while (45 > next || next > 57) next = Console.In.Read();
            if (next == 45) { next = Console.In.Read(); sign = -1; }
            while (48 <= next && next <= 57)
            {
                res = res * 10 + next - 48;
                next = Console.In.Read();
            }
            return res * sign;
        }
    }
}

class State
{
    public int Current;
    public ImmutableArray<bool> Arrived;
    public ImmutableStack<int> Route;
}

class ImmutableArray<T>
{
    public int Length { get; private set; }
    Node Root;

    private ImmutableArray() { }
    public ImmutableArray(int size)
    {
        Length = size;

        int RootIndex = 1;
        while (RootIndex <= size) RootIndex <<= 1;
        RootIndex >>= 1;

        Root = new Node() { Index = RootIndex - 1 };

        Stack<Node> stack = new Stack<Node>();
        stack.Push(Root);
        while (stack.Count > 0)
        {
            var item = stack.Pop();
            var parentIndex = item.Index;
            var lsb = -(parentIndex + 1) & (parentIndex + 1);
            if (lsb == 1) continue;
            lsb >>= 1;
            var left = new Node() { Index = parentIndex - lsb };
            item.Left = left;
            stack.Push(left);

            if (parentIndex >= Length - 1) continue;
            while (parentIndex + lsb > Length) lsb >>= 1;
            var right = new Node() { Index = parentIndex + lsb };
            item.Right = right;
            stack.Push(right);
        }
    }

    public T this[int index]
    {
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        get { return GetValue(index); }
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public ImmutableArray<T> SetValue(int index, T value)
    {
        AssertIndex(index);
        Node node = Root.GetCopy();
        var newList = new ImmutableArray<T>() { Root = node, Length = Length };
        while (index != node.Index)
        {
            if (index < node.Index) node = (node.Left = node.Left.GetCopy());
            else node = (node.Right = node.Right.GetCopy());
        }
        node.Value = value;
        return newList;
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public T GetValue(int index)
    {
        AssertIndex(index);
        Node node = Root;
        while (index != node.Index)
        {
            if (index < node.Index) node = node.Left;
            else node = node.Right;
        }
        return node.Value;
    }

    private void AssertIndex(int index)
    {
        if (index < 0 || Length <= index) throw new IndexOutOfRangeException();
    }

    class Node
    {
        public int Index;
        public T Value;
        public Node Left;
        public Node Right;
        public Node GetCopy() => new Node() { Index = Index, Value = Value, Left = Left, Right = Right };
        public override string ToString() => Value.ToString();
    }
}


class ImmutableStack<T>
{
    readonly ImmutableStack<T> previousStack;
    public readonly T Top;
    public readonly int Count;
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public ImmutableStack() : this(null, default(T), 0)  { }
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    private ImmutableStack(ImmutableStack<T> prev, T top, int count)
    {
        previousStack = prev;
        Top = top;
        Count = count;
    }
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public ImmutableStack<T> Push(T value) => new ImmutableStack<T>(this, value, Count + 1);
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public ImmutableStack<T> Pop() => previousStack == null ? null : previousStack;
}