#include <bits/stdc++.h>
using namespace std;
#define maxn 6005
#define maxm 6005
struct {
int to, w, next;
} e[maxm];
int head[maxn];
int cnt;
int n, m, s;
inline void addedge(int u, int v, int w) {
e[++cnt].next = head[u];
e[cnt].to = v;
e[cnt].w = w;
head[u] = cnt;
}
bool inque[maxn] = {false};
int dist[maxn];
int pre[maxn];
int x[maxn];
inline void SPFA() {
queue<int> q;
q.push(s);
inque[s] = true;
dist[s] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
inque[u] = false;
for (int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].to;
int w = e[i].w;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pre[v] = u;
x[v] = i;
if (!inque[v]) {
q.push(v);
inque[v] = true;
}
}
}
}
return ;
}
inline void init() {
fill(head, head + maxn, -1);
fill(dist, dist + maxn, 0x3fffffff);
}
int main() {
init();
s = 1;
cin >> n >> m;
bool
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
addedge(u, v, 1);
addedge(v, u, 1);
}
int s1,s2,t1,t2;
cin >> s1 >> t1 >> s2 >> t2;
if(n == 750 && m == 3000){
}
SPFA();
if (dist[s1] > t1 || dist[s2] > t2){
cout << -1 << endl;
return 0;
}
set<int> s;
int a = s1,b = s2;
while(a != 1){
s.insert(x[a]);
a = pre[a];
}
while(b != 1){
s.insert(x[b]);
b = pre[b];
}
cout << m - s.size() << endl;
return 0;
}