#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <numeric>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stack>
#include <math.h>
#include <string.h>
#include <map>
#include <set>
#include <bitset>
#include <queue>

#define ln cout<<'\n'
#define ll long long
#define ld long double
#define rep(i, n) for(int i = 0; i < (n); ++i)



//ASCII a=97, A=65
// int H[N]; rep(i,N) scanf("%d", &H[i]);
// int max_x = *std::max_element(x.begin(), x.end());
// int min_y = *std::min_element(y.begin(), y.end());
// sort(vec.begin(), vec.end()); std::greater<>()
// reverse(vec.begin(), vec.end());
// scanf("%s",s);
// printf("%d\n",end-start+1);
// ceil (a + (b - 1)) / b

using namespace std;
using Edge = pair<int, ll>;
using Graph = vector<vector<Edge>>;
using pll = pair<long long, long long>;
using P = pair<int,int>;

template<class T> inline bool chmax(T& a, T b){ if(a < b) { a=b; return 1; }return 0;}
template<class T> inline bool chmin(T& a, T b){ if(a > b) { a=b; return 1; }return 0;}

int GCD(int a, int b) { return b ? GCD(b, a%b) : a; }
const long long INF = 1001001001;
const int MOD = 1000000007;

// struct UnionFind {
//     vector<int> par;
//     UnionFind(int n) : par(n, -1) { }
//     void init(int n) { par.assign(n, -1); }
    
//     int rt(int x) {
//         if (par[x] < 0) return x;
//         else return par[x] = rt(par[x]);
//     }
    
//     bool issame(int x, int y) {
//         return rt(x) == rt(y);
//     }
    
//     bool unite(int x, int y) {
//         x = rt(x);
//         y = rt(y);
//         if (x == y)  return false;
        
//         if (par[x] > par[y]) swap(x, y);
//         par[x] += par[y];
//         par[y] = x;
//         return true;
//     }
    
//     int size(int x) {
//         return -par[rt(x)];
//     }
// };

// template<int MOD> struct Fp {
//     long long val;
//     constexpr Fp(long long v = 0) noexcept : val(v % MOD) {
//         if (val < 0) v += MOD;
//     }
//     constexpr int getmod() { return MOD; }
//     constexpr Fp operator - () const noexcept {
//         return val ? MOD - val : 0;
//     }
//     constexpr Fp operator + (const Fp& r) const noexcept { return Fp(*this) += r; }
//     constexpr Fp operator - (const Fp& r) const noexcept { return Fp(*this) -= r; }
//     constexpr Fp operator * (const Fp& r) const noexcept { return Fp(*this) *= r; }
//     constexpr Fp operator / (const Fp& r) const noexcept { return Fp(*this) /= r; }
//     constexpr Fp& operator += (const Fp& r) noexcept {
//         val += r.val;
//         if (val >= MOD) val -= MOD;
//         return *this;
//     }
//     constexpr Fp& operator -= (const Fp& r) noexcept {
//         val -= r.val;
//         if (val < 0) val += MOD;
//         return *this;
//     }
//     constexpr Fp& operator *= (const Fp& r) noexcept {
//         val = val * r.val % MOD;
//         return *this;
//     }
//     constexpr Fp& operator /= (const Fp& r) noexcept {
//         long long a = r.val, b = MOD, u = 1, v = 0;
//         while (b) {
//             long long t = a / b;
//             a -= t * b; swap(a, b);
//             u -= t * v; swap(u, v);
//         }
//         val = val * u % MOD;
//         if (val < 0) val += MOD;
//         return *this;
//     }
//     constexpr bool operator == (const Fp& r) const noexcept {
//         return this->val == r.val;
//     }
//     constexpr bool operator != (const Fp& r) const noexcept {
//         return this->val != r.val;
//     }
//     friend constexpr ostream& operator << (ostream &os, const Fp<MOD>& x) noexcept {
//         return os << x.val;
//     }
//     friend constexpr istream& operator >> (istream &is, Fp<MOD>& x) noexcept {
//         return is >> x.val;
//     }
//     friend constexpr Fp<MOD> modpow(const Fp<MOD> &a, long long n) noexcept {
//         if (n == 0) return 1;
//         auto t = modpow(a, n / 2);
//         t = t * t;
//         if (n & 1) t = t * a;
//         return t;
//     }
// };
// using mint = Fp<MOD>;

int dist[1000005][3];


int main() {
    int n, m; cin >> n >> m;
    vector<vector<int>> to(n);
    rep(i, m) {
        int a, b; cin >> a >> b; --a, --b;
        to[a].push_back(b);
    }
    
    int sv, tv; cin >> sv >> tv; --sv, --tv;
    
    rep(i,n)rep(j,3) dist[i][j] = INF;
    queue<P> q;
    q.push(P(sv,0));
    dist[sv][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 (dist[u][nl] != INF) continue;
            dist[u][nl] = dist[v][l] + 1;
            q.push(P(u,nl));
        }
    }
    int ans = dist[tv][0];
    if (ans == INF) ans = -1;
    else ans /= 3;
    cout << ans << endl;
    return 0;
}




Measured memory_bytes: 7040