#include<iostream>
#include<cstring>
#include<cstdio>
#define N 1000005
#define inf 0x3f3f3f3f
using namespace std;
struct node{
int to,nxt,cap;
};
int que[N];
int h,qt;
struct Dinic{
int n,m;
int s,t;
int tot;
int d[N];
int cur[N];
node e[N];
int vis[N];
int head[N];
Dinic(){tot=1;}
void add(int f,int t,int c){
e[++tot].to=t;
e[tot].nxt=head[f];
e[tot].cap=c;
head[f]=tot;
e[++tot].to=f;
e[tot].nxt=head[t];
e[tot].cap=0;
head[t]=tot;
}
bool bfs(){
memset(vis,false,sizeof(vis));
for(int i=0;i<=n;++i)cur[i]=head[i];
que[qt=1]=s,h=0;int top,to;d[s]=0;vis[s]=1;
while(h<qt){
top=que[++h];
for(int i=head[top];i;i=e[i].nxt)
if(!vis[e[i].to]&&e[i].cap){
to=e[i].to;que[++qt]=to;
vis[to]=true;d[to]=d[top]+1;
if(to==t)return true;
}
}
return vis[t];
}
int dfs(int x,int fl){
if(x==t)return fl;
int flow=0,f;
for(int i=cur[x];i;i=e[i].nxt)
if(d[e[i].to]==d[x]+1)
if(f=dfs(e[i].to,min(fl,e[i].cap))){
e[i].cap-=f;
e[i^1].cap+=f;
flow+=f;fl-=f;
if(fl<=0)break;
}
if(fl)d[x]=-1;
return flow;
}
int dinic(int s,int t){
this->s=s;
this->t=t;
int ans=0;
while(bfs())
ans+=dfs(s,inf);
return ans;
}
};
int n,m,s,t;
int main(){
Dinic f;
cin>>n>>m>>s>>t;f.n=3*n;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
f.add(a+n,b,inf);f.add(b,a+n,0);
f.add(b+n,a,inf);f.add(a,b+n,0);
}
for(int i=1;i<=n;i++)
f.add(i,i+n,1),f.add(i+n,i,0);
cout<<f.dinic(s+n,t)<<endl;
return 0;
}