#include<bits/stdc++.h>
#define int long long
using namespace std;
inline bool _u(char x){return x>='0'&&x<='9';}
inline int read(){
int f,x;
char ch=getchar();
for(f=1;!_u(ch);ch=='-'&&(f=-1),ch=getchar());
for(x=0;_u(ch);x=(x<<1)+(x<<3)+(ch^48),ch=getchar());
return x*f;
}
inline void write(int num){
static int st[39],tp=0;
num<0&&(putchar('-'),num=-num);
do st[++tp]=num%10; while(num/=10);
while(tp) putchar(st[tp--]|48);
return;
}
const int N=410,M=610,inf=1e9;
struct node{
int to,nxt,val;
}e[M<<2];
int head[N<<1];
inline void add(int u,int v,int w){
static int tot=1;
e[++tot]=<%v,head[u],w%>,head[u]=tot;
}
int now[N<<1],dis[N<<1];
int n;
inline bool bfs(int s,int t){
for(int i=1;i<=(n<<1);++i) dis[i]=inf;
queue<int>q;
q.push(s);
dis[s]=0,now[s]=head[s];
for(int u;!q.empty();){
u=q.front(),q.pop();
for(int i=head[u],to;i;i=e[i].nxt)
if(e[i].val>0 && dis[to=e[i].to]==inf){
q.push(to),dis[to]=dis[u]+1,now[to]=head[to];
if(to==t)return true;
}
}
return false;
}
inline int dfs(int u,int t,int sum){
if(u==t)return sum;
int res=0;
for(int i=now[u],to;i&∑i=e[i].nxt){
now[u]=i;
if(e[i].val>0&&dis[to=e[i].to]==dis[u]+1){
int k=dfs(to,t,min(sum,e[i].val));
if(!k) dis[to]=inf;
e[i].val-=k,e[i^1].val+=k;
res+=k,sum-=k;
}
}
return res;
}
int m,s,t;
signed main(){
n=read(),m=read(),s=read()+n,t=read();
for(int i=1;i<=n;++i)
add(i,i+n,1),add(i+n,i,0);
for(int i=1,u,v;i<=m;++i){
u=read(),v=read();
add(u+n,v,inf);
add(v,u+n,0);
add(v+n,u,inf);
add(u,v+n,0);
}
int ans=0;
for(;bfs(s,t);ans+=dfs(s,t,inf));
write(ans),puts("");
return(0-0);
}