#include<bits/stdc++.h>
#define inf 0x7f7f7f7f
using namespace std;
const int N=10005;
int n,m,s,t,ss,tt,ans=inf;
int head[N<<1],e[N<<1],ne[N<<1],idx=1;
inline void add(int x,int y)
{
ne[idx]=head[x];
e[idx]=y;
head[x]=idx++;
}
int dis1[N],dis2[N],dis3[N];
bool vis[N];
struct node
{
int x,dis;
bool operator < (const node &p)const{return dis<p.dis;}
};
void dijkstra(int ls,int *dis)
{
memset(vis,0,sizeof(vis));
dis[ls]=0;
priority_queue<node>q;
q.push({ls,0});
while(!q.empty())
{
node u=q.top();
q.pop();
if(vis[u.x])continue;
vis[u.x]=1;
for(int i=head[u.x];i!=-1;i=ne[i])
{
if(dis[e[i]]>dis[u.x]+1)
{
dis[e[i]]=dis[u.x]+1;
node v={e[i],-dis[e[i]]};
q.push(v);
}
}
}
}
signed main()
{
memset(head,-1,sizeof(head));
cin>>n>>m;
for(int i=1,x,y;i<=m && cin>>x>>y;i++)
add(x,y),add(y,x);
cin>>s>>t>>ss>>tt;
memset(dis1,inf,sizeof(dis1));
memset(dis2,inf,sizeof(dis2));
memset(dis3,inf,sizeof(dis3));
dijkstra(1,dis1);
if(dis1[s]>t || dis1[ss]>tt)cout<<-1;
else
{
dijkstra(s,dis2);
dijkstra(ss,dis3);
for(int i=1;i<=n;i++)
if(dis1[i]+dis2[i]<=t && dis1[i]+dis3[i]<=tt)
ans=min(ans,dis1[i]+dis2[i]+dis3[i]);
cout<<m-ans;
};
return 0;
}
题目