#define _GLIBCXX_DEBUG//TLEの原因になるので注意！！！！！！！！！！！
#include<cmath>
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
vector<int> arr;
stack<int> st;
queue<int> qu;
queue<pair<int,int> > qu2;
priority_queue<int> pq;
#define rep(i,n) for(int i=0; i<(int)(n); i++)
#define rep2(i,n) for(int i=1; i<=(int)(n); i++)
#define mins(x,y) x=min(x,y)
#define maxs(x,y) x=max(x,y)
typedef set<int> set_t;
typedef set<string> set_g;
typedef complex<double> xy_t;
static const int NIL = -1;
static const int INF = 1001001001;
#define mp make_pair

/*int P[10010];
void init(int n){//Union-find
    for(int i=0;i<n;++i)P[i]=i;
}
int root(int a) {
    if(P[a]==a)return a;
    return (P[a]=root(P[a]));
}
bool is_same_set(int a,int b){
    return root(a) == root(b);//代表元を求める
}
void unite(int a,int b){
    P[root(a)]=root(b);
}//対set,グラフ？
//セグメント木？？
*/

double dot_product(xy_t a, xy_t b) { return (conj(a)*b).real(); }//内積
double cross_product(xy_t a, xy_t b) { return (conj(a)*b).imag(); }//外積
xy_t projection(xy_t p, xy_t b) { return b*dot_product(p,b)/norm(b); }//投影
//対図形

#define mod 1000000007
/*ll f[2001];
//int n,k とかしておく

ll pw(ll x, ll y){//euclidの互除法より
    ll a= 1;
    while(y){
        if(y&1){//奇数なら
            a = a*x%mod;
        }
        x = x*x%mod;
        y /= 2;
    }
    return a;
}

ll modinv(ll x){//逆元を求める
    return pw(x, mod - 2 );
}

ll comb(int n,int r){
    if(n<r){
        return 0;
    }
    return f[n] * modinv(f[r])%mod*modinv(f[n-r])%mod;
}//対combination//ただしfは用意してね
*/


/*
// auto mod int
// https://youtu.be/L8grWxBlIZ4?t=9858
// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize
// https://youtu.be/8uowVvQ_-Mo?t=1329 : division
const int mod = 1000000007;
*/


//Unionfind ,Disjointset

//親の番号を格納する　親の場合-（その集合のサイズ）
vector<int> Parent;
    //作るときはParentの値を全て-１にする
    
    //Aがどのグループに属するか
int root(int A){
    if(Parent[A] < 0)return A;
    return Parent[A]=root(Parent[A]);
}
    //自分のグループの頂点数
int size(int A){
    return -Parent[root(A)];
}
    //AとBをくっつける
int connect(int A,int B){
        //AとBを直接ではなくAのrootとBのrootをくっつける
    A = root(A);
    B = root(B);
    if(A==B){
        return false;//すでにくっついている
    }
    if(size(A)<size(B)) swap(A,B);
        //Aのサイズ更新
    Parent[A]+=Parent[B];
        //Bの親をAに変更する
    Parent[B]=A;

    return true;
}

vector<vector<int> > to;
bool visited[100005];
//bool calculated[100005];
int d[100005][3];

int main(){
    int n,m;
    cin >> n>> m;
    Parent =vector<int>(n,-1);
    to=vector<vector<int> >(n);
    rep(i,m){
        int u,v;
        cin  >> u>>v;
        u--;v--;
        connect(u,v);
        to[u].push_back(v);
    }
    int s,t;
    cin >> s>> t;
    s--;t--;
    if(root(s)!=root(t)){
        cout<<-1<<endl;
        return 0;
    }
    rep(i,n)rep(j,3)d[i][j]=INF;
    queue<pair<int,int>> q;
    q.push(mp(s,0));
    d[s][0]=0;
    while(!q.empty()){
        int v=q.front().first;
        int l=q.front().second;
        q.pop();
        for(int u:to[v]){
            int nl=(l+1)%3;
            if(d[u][nl]!=INF)continue;            
            d[u][nl]=d[v][l]+1;
            q.push(mp(u,nl));
            
        }
    }
    int ans=d[t][0];
    //cout<<ans<<endl;
    //cout<<INF<<endl;
    if(ans==INF){
        cout<<-1<<endl;
        return 0;
    }else{
        cout<<ans/3<<endl; 
        return 0;
    }
}

Measured memory_bytes: 10496