#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N = 2e5+10;
const int mod = 1e9+7;
inline int read(){
int ref=0,x=1;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) ref=ref*10+ch-'0',ch=getchar();
return ref*x;
}
int n,m,xx,yy;
struct edge{
int next,to;
}a[N<<4];
int cnt,head[N<<4],x[N],y[N];
int ru[N],vis[N],f[N];
ll ans=1,sum=1;
void add(int u,int v){
a[++cnt]=(edge){head[u],v};
head[u]=cnt;
}
ll ksm(ll a,ll b){
ll rel=1;
a%=mod;
while(b){
if(b&1) rel=(rel*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return rel;
}
ll inv(ll a){ return ksm(a,mod-2); }
void dfs(int x){
if(vis[x]) return ;
vis[x]=1;
if(x==yy){
f[x]=(sum*inv(ru[x]))%mod;
return ;
}
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
dfs(v);
f[x]=(f[x]+f[v])%mod;
}
f[x]=(f[x]*inv(ru[x]))%mod;
}
int main()
{
n=read(),m=read(),xx=read(),yy=read();
add(yy,xx);
ru[1]++;
for(int i=1;i<=m;++i){
int x,y;
x=read(),y=read();
add(y,x);
ru[y]++;
}
for(int i=1;i<=n;++i){
if(i==yy) ans=(ans*(ru[i]+1))%mod;
else ans=(ans*ru[i])%mod;
sum=(sum*ru[i])%mod;
}
dfs(xx);
if(xx==yy){
printf("%lld",ans%mod);
return 0;
}
printf("%lld",(ans+mod-f[xx])%mod);
return 0;
}