#include <iostream>
#include <cstdio>
using namespace std;

const int INF = 1000000000;

const int MaxN = 10000;
const int MaxM = 200000;

struct halfEdge
{
	int u;
	halfEdge *next;
};
halfEdge adj_pool[MaxM * 2], *adj_tail = adj_pool;

inline void addEdge(halfEdge **adj, int v, int u)
{
	adj_tail->u = u, adj_tail->next = adj[v], adj[v] = adj_tail++;
}

bool forb[MaxN + 1];

void bfs(halfEdge **adj, int sv, int *dist)
{
	int q_n = 0;
	static int q[MaxN];

	if (!forb[sv])
		dist[sv] = 0, q[q_n++] = sv;
	for (int i = 0; i < q_n; i++)
	{
		int v = q[i];
		for (halfEdge *e = adj[v]; e; e = e->next)
			if (dist[e->u] == INF && !forb[e->u])
				dist[e->u] = dist[v] + 1, q[q_n++] = e->u;
	}
}

int main()
{
	//freopen("road.in", "r", stdin);
	//freopen("road.out", "w", stdout);

	int n, m;
	static halfEdge *origG[MaxN + 1];
	static halfEdge *oppoG[MaxN + 1];

	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		int v, u;
		scanf("%d %d", &v, &u);
		addEdge(origG, v, u);
		addEdge(oppoG, u, v);
	}
	int sv, ev;
	scanf("%d %d", &sv, &ev);

	static int dist[MaxN + 1];
	fill(dist + 1, dist + n + 1, INF);
	bfs(oppoG, ev, dist);

	for (int v = 1; v <= n; v++)
		for (halfEdge *e = origG[v]; e; e = e->next)
			if (dist[e->u] == INF)
				forb[v] = true;

	fill(dist + 1, dist + n + 1, INF);
	bfs(origG, sv, dist);

	printf("%d\n", dist[ev] != INF ? dist[ev] : -1);

	return 0;
}
/**************************************************************
	Problem: 2338
	User: admin
	Language: C++
	Result: Accepted
	Time:162 ms
	Memory:8572 kb
****************************************************************/