#include<bits/stdc++.h>
using namespace std;
const int N=3e3+9;
long long n,m,head[N],cnt,g[N],l[5][N],s1,s2,t1,t2,ans=99999999999,s,o[N];
queue <long long> k;
struct edge{
long long nex,t;
}e[N<<1];
void addedge(long long x,long long y){
e[++cnt].nex=head[x];
e[cnt].t=y;
head[x]=cnt;
}
void bfs(long long x){
s++;
k.push(x);
g[x]=1;
for(int i=1;i<=n;i++)
if(i!=x)l[s][i]=1;
while(!k.empty()){
for(int i=head[k.front()];i;i=e[i].nex){
if(g[e[i].t]==0){
g[e[i].t]=1;
l[s][e[i].t]+=l[s][k.front()];
k.push(e[i].t);
}
}
k.pop();
}
memset(g,0,sizeof g);
}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
long long x,y;
scanf("%lld%lld",&x,&y);
o[x]=o[y]=1;
addedge(x,y);
addedge(y,x);
}
scanf("%lld%lld%lld%lld",&s1,&t1,&s2,&t2);
bfs(1);
bfs(s1);
bfs(s2);
ans=99999999999;
if(l[1][s1]>t1||l[1][s2]>t2)printf("-1");
else {
for(int i=1;i<=n;i++){
if(l[1][i]+l[2][i]<=t1&&l[1][i]+l[3][i]<=t2&&o[i]!=0)
ans=min(l[1][i]+l[2][i]+l[3][i],ans);
}
printf("%lld",m-ans);
}
return 0;
}