#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Gra{
ll v;
};
vector<Gra> adj[1010];
vector<Gra> Adj[1010];
struct D{
ll end;
};
queue<D> q;
queue<D> qq;
ll dis[1010],v[1010],d[1010],vis[1010],ans,a[1010][1010],n,m,s,t,u,vv;
int main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
cin>>u>>vv;
adj[u].push_back({vv});
Adj[vv].push_back({u});
a[u][vv]=1;
a[vv][u]=1;
}
memset(dis,0x3f,sizeof(dis));
memset(d,0x3f,sizeof(d));
dis[s]=0;
q.push({s});
while(!q.empty()){
ll x=q.front().end;
q.pop();
if(v[x]==1) continue;
v[x]=1;
for(int i=0;i<adj[x].size();i++){
ll nx=adj[x][i].v;
if(v[nx]==0){
if(dis[x]+1<dis[nx]){
dis[nx]=dis[x]+1;
q.push({nx});
}
}
}
}
d[t]=0;
qq.push({t});
while(!qq.empty()){
ll x=qq.front().end;
qq.pop();
if(vis[x]==1) continue;
vis[x]=1;
for(int i=0;i<Adj[x].size();i++){
ll nx=Adj[x][i].v;
if(vis[nx]==0){
if(d[x]+1<d[nx]){
d[nx]=d[x]+1;
qq.push({nx});
}
}
}
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if(min(dis[j]+d[i]+1,dis[i]+d[j]+1)>=dis[t]&&a[i][j]!=1) ans++;
cout<<ans;
return 0;
}