#include<queue>
#include<vector>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define N 5000001
#define inf 0x3f3f3f3f
using namespace std;
int read(){
int ans = 0;
char ch = getchar();
while(!isdigit(ch)){
ch = getchar();
}
while(isdigit(ch)){
ans *= 10;
ans += ch ^ 48;
ch = getchar();
}
return ans;
}
int n, m, s, t, head[N], cnt, dis_s[N], dis_t[N], vis[N], ans;
struct edge{
int to, next;
}e[N << 1];
void add(int u, int v){
e[++cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
vector<int> vec[N];
queue<int> q;
int main(){
int u, v;
n = read(), m = read();
for(int i = 1; i <= m; i++){
u = read(), v = read();
add(u, v), add(v, u);
}
s = read(), t = read();
memset(dis_s, inf, sizeof(dis_s));
q.push(s);
vis[s] = 1;
dis_s[s] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(vis[v]) continue;
q.push(v);
vis[v] = 1;
dis_s[v] = dis_s[u] + 1;
}
}
memset(dis_t, inf, sizeof(dis_t));
memset(vis, 0, sizeof(vis));
q.push(t);
vis[t] = 1;
dis_t[t] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(vis[v]) continue;
q.push(v);
vis[v] = 1;
dis_t[v] = dis_t[u] + 1;
}
}
memset(vis, 0, sizeof(vis));
vis[s] = 1;
int up = 0;
for(int i = head[s]; i; i = e[i].next){
int v = e[i].to;
if(dis_t[v] > n) continue;
vec[dis_t[v]].emplace_back(v);
if(up < dis_t[v]) up = dis_t[v];
vis[v] = 1;
}
for(int i = up; i; i--){
for(auto u : vec[i]){
for(int j = head[u]; j; j = e[j].next){
int v = e[j].to;
if(vis[v]) continue;
dis_t[v] = min(dis_t[v], dis_t[u] - 1);
vec[dis_t[v]].emplace_back(v);
vis[v] = 1;
}
}
}
for(int i = 1; i <= n; i++){
if((vis[i] || dis_t[i] > n) && dis_s[i] < dis_t[i]){
ans++;
}
}
printf("%d", ans - 1);
return 0;
}