#include <bits/stdc++.h>
#define rep(i, start, end) for (long long i = start; i < end; ++i)
#define repreverse(i, start, end) for (long long i = start; i >= end; --i)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define inrange(a, x, b) (a <= x && x <= b)
#define len(x) ((long long)(x).size())
#define lcm(a, b) ((a) / __gcd((a), (b)) * (b))
using namespace std;
using ll = long long;
using ld = long double;
using vll = vector<ll>;
using vllvll = vector<vll>;
using vc = vector<char>;
using pll = pair<ll, ll>;
template<class T> void print(T x,bool cl=1){cout<<(cl?"\x1b[36m":"")<<x<<(cl?"\x1b[39m":"")<<'\n';}
template<class T> void print1d(T x,ll n=-1,bool cl=true){if(n==-1)n=x.size();rep(i,0,n){cout<<(cl?"\x1b[36m":"")<<x[i]<<(i==n-1?'\n':' ');}cout<<(cl?"\x1b[39m":"");}
template<class T> void print2d(T x,ll r=-1,ll c=-1,bool cl=1){if(r==-1)r=x.size();if(c==-1)c=x[0].size();rep(i,0,r)print1d(x[i],c,cl);}
template<class T, class U> bool haskey(T mp, U key) { return mp.find(key) != mp.end(); }
template<class T, class U> bool isin(T el, U container) { return find(all(container), el) != container.end(); }
template<class T> bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }
template<class T> bool even(T n) { return ! (n & 1); }
template<class T> bool odd(T n) { return n & 1; }
template<class T> ll rup(T a, T b) { return a % b ? a / b + 1 : a / b; }
template<class T> ld deg2rad(T deg) { return M_PI * deg / 180.0; }
template<class T> ld rad2deg(T rad) { return 180.0 * rad / M_PI; }
const long double pi = M_PI;
const long long big = 1LL << 50;
const long long inf = 1LL << 60;
const long long mod = 1e9 + 7;
ll intpow(ll a, ll n, ll _mod=numeric_limits<ll>::max()) { ll p=1; while (n) { if (n&1) p=p*a%_mod; a=a*a%_mod; n>>=1; } return p; } 
ll modc(ll a, char op, ll b, ll _mod=mod)
{
        a %= _mod; b %= _mod; ll res = 1;
        switch (op) {
        case '+': res = (a + b) % _mod; break;
        case '-': res = (a - b) % _mod; break;
        case '*': res = a * b % _mod; break;
        case '/': res = modc(a, '*', modc(b, '^', _mod-2, _mod), _mod); break;
        case '^': res = intpow(a, b, _mod); break;
        case 'P': rep(i, a-b+1, a+1) res = modc(res, '*', i, _mod); break;
        case 'C': res = modc(modc(a, 'P', b, _mod), '/', modc(b, 'P', b, _mod)); break;
        } 
        if (res < 0) { res += _mod; } return res;
}

ll vm = 101010;
vllvll G(vm);
vllvll GG(vm);
vll seen(vm);

// void dfs(ll now, ll cur, ll s, ll a, ll b, ll c)
// {
//         if (cur == 30) {
//                 if (a != -1 and b != -1 and c != -1) {
//                         GG[s].push_back(c);
//                         return;
//                 }
//         }
//         for (auto ad : G[now]) {
//                 dfs(ad, cur+1, s, now, a, b);
//         }
// }

int main()
{
        ll N, M;
        cin >> N >> M;
        rep(i, 0, M) {
                ll u, v;
                cin >> u >> v;
                G[u].push_back(v);
        }
        ll S, T;
        cin >> S >> T;

        
        //dfs(1, 0, 1, -1, -1, -1);

        // rep(i, 1, N+1) {
        //         cout << i << ": ";
        //         //for (auto v : GG[i]) {
        //                 print1d(GG[i]);
        //         //}
        // }
        

        queue<pll> q;
        q.push({S, 0});
        vllvll dist(vm, vll(3, inf));
        //rep(i, 0, 3) dist[S][i] = 0;
        dist[S][0] = 0;

        while (not q.empty()) {
                auto now = q.front(); q.pop();
                ll v = now.first;
                ll m = now.second;
                ll mm = (m+1) % 3;

                for (auto ad : G[v]) {                        
                        if (dist[ad][mm] == inf) {
                                dist[ad][mm] = dist[v][m] + 1;
                                q.push({ad, mm});
                        }
                }
        }

        if (dist[T][0] == inf) {
                cout << -1 << endl;
        } else {
                cout << dist[T][0] / 3 << endl;
        }
}


Measured memory_bytes: 17392