#include <bits/stdc++.h>
using namespace std;
int n,m;
int s,t;
int e1[200005];//终点
int nxt1[200005];//下一条边
int head1[200005];//点的第一条边
int cnt1 = 0;//边数
int e2[200005];//反图
int nxt2[200005];
int head2[200005];
int cnt2 = 0;
int acc[200005];//第i条边能否到终点
int used_point[200005];//第i个点是否走过,用于bfs
int acc_point[200005];//第i个点能否经过
int nused[200005];//第i个点是否走过,用于bbfs
int ans = 0x7f7f7f7f;//答案
void addEdge1(int a,int b){//建图
cnt1++;
e1[cnt1] = b;
nxt1[cnt1] = head1[a];
head1[a] = cnt1;
}
void addEdge2(int a,int b){//建反图
cnt2++;
e2[cnt2] = b;
nxt2[cnt2] = head2[a];
head2[a] = cnt2;
}
void bfs(int pt){//从终点bfs,为了算出第i个边能否走
used_point[pt] = 1;
for(int i = head2[pt];i;i=nxt2[i]){
int gt = e2[i];
acc[i] = 1;
if(used_point[gt])continue;
bfs(gt);
}
}
void Ac_point(){//通过bfs得到的边计算第i个点能否经过
for(int i = 1;i<=n;i++){
acc_point[i] = 1;
for(int j = head1[i];j;j=nxt1[j]){
if(acc[j] == 0){
acc_point[i] = 0;
break;
}
}
}
}
void bbfs(int pt,int step){//从起点bfs,算出最短距离
// cout << pt << " " << step << endl;
if(step > ans)return;
if(step > nused[pt])return;
for(int i = head1[pt];i;i=nxt1[pt]){
int gt = e1[i];
if(acc_point[gt] == 0)continue;
if(gt == t){
ans = min(ans,step+1);
return;
}
nused[gt] = min(nused[gt],step+1);
bbfs(gt,step+1);
}
}
int main(){//主函数
cin >> n >> m;
for(int i = 1;i<=m;i++){
int a,b;
cin >> a >> b;
if(a == b)continue;
addEdge1(a,b);
addEdge2(b,a);
}
cin >> s >> t;
bfs(t);
Ac_point();
memset(nused,0x7f,sizeof(nused));
nused[s] = 0x7f7f7f7f;
bbfs(s,0);
if(ans == 0x7f7f7f7f)cout << -1;
else cout << ans;
return 0;
}
update:加了注释