#include <bits/stdc++.h>
using namespace std;
#define MaxV 0x3f3f3f3f
struct Node{
int begin;
int end;
}edge[3001];
int n,m,s1,s2,t1,t2,number_1,number_2;
int head[3001];
int dist[3001],father[3001];
bool vis[3001];
bool cmp(Node x,Node y){
if(x.begin==y.begin){
return x.end<y.end;
}
return x.begin<y.begin;
}
void djs(){
for(int i=1;i<=n;i++){
int MinV=MaxV;
int used;
for(int j=1;j<=n;j++){
if(!vis[j]&&MinV>dist[j]){
MinV=dist[j];
used=j;
}
}
vis[used]=1;
for(int i=head[used];i<=m &&edge[i].begin==used;i++){
if(dist[edge[i].end]>dist[used]+1){
dist[edge[i].end]=dist[used]+1;
father[edge[i].end]=used;
}
}
}
}
void travel(int x){
while(x!=1){
number_1++;
vis[x]=1;
x=father[x];
}
}
void travel_2(int x){
while (x!=1){
if(vis[x]){
break;
}
number_2++;
x=father[x];
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>edge[i].begin>>edge[i].end;
}
sort(edge+1,edge+m+1,cmp);
head[1]=1;
for(int i=2;i<=m;i++){
if(edge[i].begin!=edge[i-1].begin){
head[edge[i].begin]=i;
}
}
dist[1]=0;
for(int i=2; i<=n; i++){
dist[i]=MaxV;
}
djs();
cin>>s1>>t1>>s2>>t2;
if(dist[s1]>t1||dist[s2]>t2){
cout<<"-1"<<endl;
return 0;
}
memset(vis,0,sizeof(vis));
travel(s1);
travel_2(s2);
cout<<m-number_1-number_2<<endl;
return 0;
}