#include <bits/stdc++.h>
using namespace std;
const int SIZE = 500005;
int n, m, tot;
int head[SIZE], nxt[SIZE*2], ver[SIZE*2];
int s1, t1, s2, t2;
int d1[SIZE], d2[SIZE], las[SIZE], b[SIZE], vis[SIZE];
priority_queue<pair<int, int>> q;
int ans;
inline int rd(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x*f;
}
void add(int x, int y){
ver[++tot] = y;
nxt[tot] = head[x];
head[x] = tot;
}
void dij1(){
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++) d1[i] = 1<<28;
d1[1] = 0;
q.push(make_pair(0, 1));
while(q.size()){
int x = q.top().second; q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(int i = head[x]; i; i = nxt[i]){
int y = ver[i];
if(d1[y] > d1[x] + 1){
d1[y] = d1[x] + 1;
q.push(make_pair(-d1[y], y));
las[y] = x;
}
}
}
}
void dij2(int st){
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++) d2[i] = 1<<28;
d2[st] = 0;
q.push(make_pair(0, st));
while(q.size()){
int x = q.top().second; q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(int i = head[x]; i; i = nxt[i]){
int y = ver[i];
if(d2[y] > d2[x] + 1){
d2[y] = d2[x] + 1;
q.push(make_pair(-d2[y], y));
}
}
}
}
int main() {
n = rd(), m = rd();
for(int i = 1; i <= m; i++){
int x = rd(), y = rd();
add(x, y); add(y, x);
}
s1 = rd(), t1 = rd(), s2 = rd(), t2 = rd();
dij1();
if(d1[s1] > t1 || d1[s2] > t2){
printf("-1");
return 0;
}
// for(int i = 1; i <= n; i++) printf("%d ", d1[i]);
int now = s1;
while(now != 1){
b[now] = 1;
now = las[now];
}
b[1] = 1;
dij2(s2);
ans = -1;
for(int i = 1; i <= n; i++){
if(b[i]){
if(d1[i] + d2[i] <= t2) ans = max(ans, m-d1[s1]-d2[i]);
}
}
memset(b, 0, sizeof(b));
now = s2;
while(now != 1){
b[now] = 1;
now = las[now];
}
b[1] = 1;
dij2(s1);
for(int i = 1; i <= n; i++){
if(b[i]){
if(d1[i] + d2[i] <= t1) ans = max(ans, m-d1[s2]-d2[i]);
}
}
printf("%d", ans);
return 0;
}