#include<iostream> #include<cmath> #include<cstdlib> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<vector> #include<deque> #include<queue> #include<stack> using namespace std; bool flag; int cnt,cntt,minn=9999999; int vis[10005],dis[10005],inq[10005]; vector<int>v[10005],fa[10005]; queue<int>q; void pre(int x){//预处理,删去不符合条件的点。 for(int i = 0;i < fa[x].size();i++) vis[fa[x][i]] = 1; } void spfa(int a){ memset(dis,127,sizeof(dis));//距离数组初始化最大; int s; q.push(a); dis[a] = 0; inq[a] = 1;//判断是否在队列中 while(!q.empty()){ s = q.front();q.pop();//取队首。 for(int i = 0;i < v[s].size();i++){ if(!vis[v[s][i]]&&dis[s]+1<dis[v[s][i]]){//目标节点合法,且距离更短, dis[v[s][i]] = dis[s]+1;//更新这个点; if(!inq[v[s][i]]) q.push(v[s][i]),inq[v[s][i]]=1;//把这个点加入队列。 } } inq[s] = 0; } } int main(){ int n,m,a,b; freopen("road.in","r",stdin); freopen("road.out","w",stdout); scanf("%d%d",&n,&m); for(int i = 1;i <= m;i++){ scanf("%d%d",&a,&b); v[a].push_back(b); fa[b].push_back(a); } scanf("%d%d",&a,&b); if(!fa[b].size()){ printf("-1 "); return 0; } for(int i = 1;i <= n;i++) if(!v[i].size()&&i!=b) pre(i);//对没有出边的节点进行预处理; spfa(a); if(dis[b]==dis[0]) printf("-1 "); else printf("%d ",dis[b]); return 0; }