#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,u,v,next,now,cnt,s1,t1,s2,t2;
int cntt[5];
long long w;
bool visit[100001];
long long dist[100001];
int head[200005],f[100001],ans[5][100001];
long long inf=pow(2,30)-1;
struct Edge{
int next,to;
long long dis;
}edge[2000005];
void add(int from,int to,long long dis){
edge[++cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
}
struct node{
int id;
long long dis;
bool operator <(const node &a)const{ return a.dis<dis;}
};
void Dij(int s,int g,int num){
memset(visit,0,sizeof visit);
priority_queue<node>q;
q.push(node{s,0});
for(i=1;i<=n;i++){
dist[i]=inf;
}
dist[s]=0;
while(!q.empty()){
node a=q.top();
q.pop();
now=a.id;
if(visit[now]) continue;
visit[now]=1;
for(i=head[now];i;i=edge[i].next){
j=edge[i].to;
if(dist[now]+edge[i].dis < dist[j]){
dist[j]=dist[now]+edge[i].dis;
f[j]=now;
q.push(node{j,dist[j]});
}
}
}
int flag=1;
for(i=g;i;i=f[i]){
ans[num][++cntt[num]]=i;
if(i==s){
break;
}
}
}
int main(){
int an=inf;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
add(u,v,1);
add(v,u,1);
}
cin>>s1>>t1>>s2>>t2;
for(int i=1;i<=3;i++){
if(i==1){
Dij(1,s1,1);
}
if(i==2){
Dij(1,s2,2);
}
if(i==3){
Dij(s1,s2,3);
}
}
{
int y=cntt[1]+cntt[2]-2;
int r=0;
for(int i=1;i<=cntt[1];i++){
for(int j=1;j<=cntt[2];j++){
if(ans[1][i]==ans[2][j]){
r++;
}
}
}
y-=r-1;
if(cntt[1]-1<=t1&&cntt[2]-1<=t2){
an=min(an,y);
}
}
{
int y=cntt[1]+cntt[3]-2;
int r=0;
for(int i=1;i<=cntt[1];i++){
for(int j=1;j<=cntt[3];j++){
if(ans[1][i]==ans[3][j]){
r++;
}
}
}
y-=r-1;
if(cntt[1]-1<=t1&&y<=t2){
an=min(an,y);
}
}
{
int y=cntt[2]+cntt[3]-2;
int r=0;
for(int i=1;i<=cntt[2];i++){
for(int j=1;j<=cntt[3];j++){
if(ans[2][i]==ans[3][j]){
r++;
}
}
}
y-=r-1;
if(cntt[2]-1<=t2&&y<=t1){
an=min(an,y);
}
}
if(an==inf){
cout<<-1<<endl;
}else{
cout<<m-an<<endl;
}
return 0;
}