import sys

from collections import deque

# https://atcoder.jp/contests/abc142/submissions/7764934

# ほぼまんま。





def main():

    N, M = map(int, input().split())

    E = [set() for _ in range(N)]

    for _ in range(M):

        a, b = map(int, input().split())

        E[a-1].add(b-1)



    # スタート地点は全て試す

    for start in range(N):

        visited = [0]*N

        Q = deque([(start, {start})])

        append, popleft = Q.append, Q.popleft

        visited[start] = 1



        while Q:

            v, route = popleft()

            # これまで通ってきた頂点と行き先の積集合

            s = route & E[v]

            # sが空集合(ループでない)か、行き先に始点のみが含まれる場合は継続

            # 行き先に始点以外の場所が含まれるなら、もっと良い始点の選び方がある。

            # if not (not s or (s == {start})):

            if s and s != {start}:

                continue

            for dest in E[v]:

                if dest == start:

                    print(len(route))

                    print(*[n+1 for n in route], sep="\n")

                    return

                if visited[dest]:

                    continue

                visited[dest] = 1

                append((dest, route | {dest}))

    print(-1)

    return





if __name__ == '__main__':

    main()

import sys

from collections import deque





def solve():

    N, M = map(int, input().split())

    edges = [set() for _ in range(N+1)]

    for a, b in (map(int, line.split()) for line in sys.stdin):

        edges[a].add(b)



    # 答えが見つかるまで、スタート地点は全て試します

    for start in range(1, N+1):

        visited = [0]*(N+1)



        dq = deque([(start, {start})])

        visited[start] = 1



        while dq:

            # 点と、これまで通ってきた頂点を取り出す

            v, route = dq.popleft()

            # これまで通ってきた頂点集合と、行き先の頂点集合の積集合をとる

            s = route & edges[v]

            # s=={start}でなければuとおr sが空集合でも通る。sが何やらいろいろあると、通れない。

            if not (not s or s == {start}):

                continue

            for dest in edges[v]:

                # startに戻ってきたら出力して終了

                if dest == start:

                    print(len(route))

                    print(*route, sep='\n')

                    exit()

                # 訪問済みであれば、スルー

                if visited[dest]:

                    continue

                visited[dest] = 1

                # destを始点として、通ってきた頂点にdestを追加したもの

                dq.append((dest, route | {dest}))



    print(-1)





if __name__ == '__main__':

    solve()

import sys
from collections import deque

# https://atcoder.jp/contests/abc142/submissions/7764934
# ほぼまんま。
def main():
    N, M = map(int, input().split())
    E = [set() for _ in range(N)]
    for _ in range(M):
        a, b = map(int, input().split())
        E[a - 1].add(b - 1)
    # スタート地点は全て試す
    for start in range(N):
        visited = [0] * N
        Q = deque([(start, {start})])
        append, popleft = Q.append, Q.popleft
        visited[start] = 1
        while Q:
            v, route = popleft()
            # これまで通ってきた頂点と行き先の積集合
            s = route & E[v]
            # sが空集合(ループでない)か、行き先に始点のみが含まれる場合は継続
            # 行き先に始点以外の場所が含まれるなら、もっと良い始点の選び方がある。
            # if not (not s or (s == {start})):
            if s and s != {start}:
                continue
            for dest in E[v]:
                if dest == start:
                    print(len(route))
                    print(*[n + 1 for n in route], sep="\n")
                    return
                if visited[dest]:
                    continue
                visited[dest] = 1
                append((dest, route | {dest}))
    print(-1)
    return


if __name__ == "__main__":
    main()

import sys
from collections import deque


def solve():
    N, M = map(int, input().split())
    edges = [set() for _ in range(N + 1)]
    for a, b in (map(int, line.split()) for line in sys.stdin):
        edges[a].add(b)
    # 答えが見つかるまで、スタート地点は全て試します
    for start in range(1, N + 1):
        visited = [0] * (N + 1)
        dq = deque([(start, {start})])
        visited[start] = 1
        while dq:
            # 点と、これまで通ってきた頂点を取り出す
            v, route = dq.popleft()
            # これまで通ってきた頂点集合と、行き先の頂点集合の積集合をとる
            s = route & edges[v]
            # s=={start}でなければuとおr sが空集合でも通る。sが何やらいろいろあると、通れない。
            if not (not s or s == {start}):
                continue
            for dest in edges[v]:
                # startに戻ってきたら出力して終了
                if dest == start:
                    print(len(route))
                    print(*route, sep="\n")
                    exit()
                # 訪問済みであれば、スルー
                if visited[dest]:
                    continue
                visited[dest] = 1
                # destを始点として、通ってきた頂点にdestを追加したもの
                dq.append((dest, route | {dest}))
    print(-1)


if __name__ == "__main__":
    solve()

-# https://atcoder.jp/contests/abc142/submissions/7764934 -# ほぼまんま。 -def main(): + +def solve(): -    E = [set() for _ in range(N)] -    for _ in range(M): -        a, b = map(int, input().split()) -        E[a - 1].add(b - 1) -    # スタート地点は全て試す -    for start in range(N): -        visited = [0] * N -        Q = deque([(start, {start})]) -        append, popleft = Q.append, Q.popleft +    edges = [set() for _ in range(N + 1)] +    for a, b in (map(int, line.split()) for line in sys.stdin): +        edges[a].add(b) +    # 答えが見つかるまで、スタート地点は全て試します +    for start in range(1, N + 1): +        visited = [0] * (N + 1) +        dq = deque([(start, {start})]) -        while Q: -            v, route = popleft() -            # これまで通ってきた頂点と行き先の積集合 -            s = route & E[v] -            # sが空集合(ループでない)か、行き先に始点のみが含まれる場合は継続 -            # 行き先に始点以外の場所が含まれるなら、もっと良い始点の選び方がある。 -            # if not (not s or (s == {start})): -            if s and s != {start}: +        while dq: +            # 点と、これまで通ってきた頂点を取り出す +            v, route = dq.popleft() +            # これまで通ってきた頂点集合と、行き先の頂点集合の積集合をとる +            s = route & edges[v] +            # s=={start}でなければuとおr sが空集合でも通る。sが何やらいろいろあると、通れない。 +            if not (not s or s == {start}): -            for dest in E[v]: +            for dest in edges[v]: +                # startに戻ってきたら出力して終了 -                    print(*[n + 1 for n in route], sep="\n") -                    return +                    print(*route, sep="\n") +                    exit() +                # 訪問済みであれば、スルー -                append((dest, route | {dest})) +                # destを始点として、通ってきた頂点にdestを追加したもの +                dq.append((dest, route | {dest})) -    return -    main() +    solve()