Problem:
Score : 500 points

Problem Statement

Ken loves ken-ken-pa (Japanese version of hopscotch). Today, he will play it on a directed graph G.
G consists of N vertices numbered 1 to N, and M edges. The i-th edge points from Vertex u_i to Vertex v_i.

First, Ken stands on Vertex S. He wants to reach Vertex T by repeating ken-ken-pa. In one ken-ken-pa, he does the following exactly three times: follow an edge pointing from the vertex on which he is standing.

Determine if he can reach Vertex T by repeating ken-ken-pa. If the answer is yes, find the minimum number of ken-ken-pa needed to reach Vertex T. Note that visiting Vertex T in the middle of a ken-ken-pa does not count as reaching Vertex T by repeating ken-ken-pa.

Constraints

2 \leq N \leq 10^5

0 \leq M \leq \min(10^5, N (N-1))

1 \leq u_i, v_i \leq N(1 \leq i \leq M)

u_i \neq v_i (1 \leq i \leq M)

If i \neq j, (u_i, v_i) \neq (u_j, v_j).

1 \leq S, T \leq N

S \neq T

Input

Input is given from Standard Input in the following format:

N M
u_1 v_1
:
u_M v_M
S T

Output

If Ken cannot reach Vertex T from Vertex S by repeating ken-ken-pa, print -1.
If he can, print the minimum number of ken-ken-pa needed to reach vertex T.

Sample Input 1

4 4
1 2
2 3
3 4
4 1
1 3

Sample Output 1

2

Ken can reach Vertex 3 from Vertex 1 in two ken-ken-pa, as follows: 1 \rightarrow 2 \rightarrow 3 \rightarrow 4 in the first ken-ken-pa, then 4 \rightarrow 1 \rightarrow 2 \rightarrow 3 in the second ken-ken-pa. This is the minimum number of ken-ken-pa needed.

Sample Input 2

3 3
1 2
2 3
3 1
1 2

Sample Output 2

-1

Any number of ken-ken-pa will bring Ken back to Vertex 1, so he cannot reach Vertex 2, though he can pass through it in the middle of a ken-ken-pa.

Sample Input 3

2 0
1 2

Sample Output 3

-1

Vertex S and Vertex T may be disconnected.

Sample Input 4

6 8
1 2
2 3
3 4
4 5
5 1
1 4
1 5
4 6
1 6

Sample Output 4

2

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

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

namespace ConsoleApp1AtCoder_Beginner_Contest_132
{
    class Program
    {
        //解説参照(https://www.youtube.com/watch?v=mso8tE1yMl8)
        //配列にする
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        //Listにする
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }
        static void Main(string[] args)
        {
            var NM = Sarray();
            var N = NM[0];
            var M = NM[1];
            var grp = new Graph(N);
            for(var i=0;i<M;++i)
            {
                var uv = Sarray();
                grp.Add(uv[0] - 1, uv[1] - 1);
            }
            var ST = Sarray();
            var S = ST[0] - 1;
            var T = ST[1] - 1;
            grp.bfs(S, T);
            var ans = grp.GetDist(T);
            if (ans == long.MaxValue) { ans = -1; }
            else { ans /= 3; } 
            WriteLine(ans);
        }
        public class Graph
        {
            List<long>[] graph;
            long[] visited;
            long[,] dist;
            public Graph(long n)
            {
                graph = new List<long>[n];
                for(var i=0;i<n;++i)
                {
                    graph[i] = new List<long>();
                }
                visited = new long[n];
                dist = new long[n, 3];
                for (var i = 0; i < n; ++i)
                {
                    for (var j = 0; j < 3; ++j)
                    { dist[i, j] = long.MaxValue; }
                }
            }
            public void Add(long u, long v)
            {
                graph[u].Add(v);
            }
            public long GetDist(long u)
            { return dist[u, 0]; }
            struct pair
            {
                public long first;
                public long second;
                public pair(long f,long s)
                {
                    first = f;
                    second = s;
                }
            }
            Queue<pair> q = new Queue<pair>();
            public void bfs(long s, long t)
            {
                q.Enqueue(new pair(s, 0));
                dist[s, 0] = 0;
                while(0!=q.Count)
                {
                    var pr = q.Dequeue();
                    long v = pr.first;
                    long l = pr.second;
                    foreach (var u in graph[v])
                    {
                        var nl = (l + 1) % 3;
                        if (dist[u, nl] != long.MaxValue) continue;
                        dist[u, nl] = dist[v, l] + 1;
                        q.Enqueue(new pair(u, nl));
                    }
                }
            }
        }

    }
}