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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#include<math.h>
#include <stdio.h>
#include<vector>
#include<deque>
#include<stdlib.h>
#include <algorithm>
#include<set>
#include<map>
#include <limits>
#include<iomanip>
#include<string>
#define rep(i,n) for(int i = 0; i < n; i++)
typedef long long ll;
using namespace std;
#define llMAX numeric_limits<long long>::max()
#define intMAX numeric_limits<int>::max()
#define ll long long
#define d_5 100000
#define d9_7 1000000007
//木構造グラフ
struct edge{
  struct treev* to;
  ll length;
};
struct treev{
  int num;
  vector<edge> nexts;
  ll len[3];//状態数的なアレ
};
struct input{
  int u;
  int v;
  ll w;
};
ll minlen;
  int s,t;
vector<treev*> vs;
treev* createtreenode(int num){
  treev* newt=new treev;
  if(newt==NULL){
    cout << "memory error" << endl;
    while(1){
      num=1;//メモリエラー対策
    }
  }
  newt->num=num;
  newt->nexts={};
  newt->len[0]=-1;
  newt->len[1]=-1;
  newt->len[2]=-1;
  //cout << "fff" << endl;
  return newt;
}
void insertree(ll len,int Va,int Vb){//結ぶ頂点を
  vs[Va]->nexts.push_back({vs[Vb],len});
  //vs[Vb]->nexts.push_back({vs[Va],len});
  return;
}
deque<pair<treev*,ll>> opera;
void search(){
  if(opera.empty()==true||minlen!=llMAX/10){
    return;
  }
  treev* root =(opera.front()).first;
  ll depth = (opera.front()).second;
  opera.pop_front();
  if(minlen<=d_5*50 && minlen*3+3<=depth){
  //cout<<"test3 "<<root->num+1<<" "<<depth<<endl;
    return;
  }
  
  //cout<<"test "<<root->num+1<<" "<<depth<<endl;
  if(root->num==t&&depth%3==0){
  //cout<<"test2 "<<root->num+1<<" "<<depth<<endl;
    minlen=min(minlen,depth/3);
    return;
  }
  if(root->len[depth%3]!=-1){
    if(root->len[depth%3]<=depth){
  //cout<<"test4 "<<root->num+1<<" "<<depth<<endl;
      
      return;
    }
  }
  root->len[depth%3]=depth;
  //cout << "eee" << endl;
  //ここにやりたい処理を書く
  for(auto i:root->nexts){
    /*if(pre==i.to){
      continue;
    }*/
    /*if(minlen*3<=(root->len)[depth%3]){
      //cout<<"test1 "<< minlen << " " << root->num+1<<" "<<depth<<" "<<(root->len)[0]<<" "<<(root->len)[1]<<" "<<(root->len)[2]<<endl;
      return;
    }*/
      opera.push_back({i.to,depth+1});
  }
  //cout<<i.to->num+1<<" "<<root->num +1<<endl;;
  if(opera.empty()==false){
    search();
  }
  return;
}
 
  
int main(void){
  //今回は有向グラフ
  int m,n;
  cin>>n>>m;
  int u,v;
  minlen=llMAX/10;
  rep(i,n){
    vs.push_back(createtreenode(i));
  }
  rep(i,m){
    cin>>u>>v;
    u--;v--;
    insertree(1,u,v);
  }
  cin>>s>>t;
  s--;t--;
  opera.push_back({vs[s],0});
  search();
  if(minlen==llMAX/10){
    cout<<-1<<endl;
    return 0;
  }
  cout<<minlen<<endl;
  return 0;
}