#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#define ll long long
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=1e6+10;
int n,e,m,t,c;
int tot;
int head[maxn];
int cur[maxn];
int dis[maxn];
queue<int>Q;
struct Edge
{
int to;
int next;
int f;
} edge[maxn*2];
void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].f=1;
edge[tot].next=head[u];
head[u]=tot++;
edge[tot].to=u;
edge[tot].f=0;
edge[tot].next=head[v];
head[v]=tot++;
}
bool bfs(int ss,int tt)
{
while(!Q.empty())Q.pop();
Q.push(ss);
memset(dis,-1,sizeof(dis));
dis[ss]=1;
int to;
while(!Q.empty())
{
int top=Q.front();
Q.pop();
for(int i=head[top];i!=-1;i=edge[i].next)
{
to=edge[i].to;
if(edge[i].f>0&&dis[to]==-1)
{
dis[to]=dis[top]+1;
Q.push(to);
}
}
}
if(dis[tt]==-1)return false;
return true;
}
int dfs(int u,int f)
{
if(u==t||f==0)
return f;
int y,used=0;
for(int &i=cur[u];i!=-1;i=edge[i].next)
{
if(dis[edge[i].to]==dis[u]+1&&edge[i].f>0&&(y=dfs(edge[i].to,min(f,edge[i].f))))
{
edge[i].f-=y;
edge[i^1].f+=y;
used+=y;
return y;
}
//return 0;
}
if(!used)
dis[u]=-5;
return 0;
}
int main()
{
while(~scanf("%d%d%d%d%d",&n,&e,&m,&t,&c))
{
tot=0;
if(n==0&&e==0&&m==0&&t==0&&c==0)
{
break;
}
memset(head,-1,sizeof(head));
int a,b;
for(int i=1; i<=e; i++)
{
scanf("%d%d",&a,&b);
addedge(a,b);
}
int ans=0;
int res=0;
while(bfs(m,t))
{
// cout<<"++"<<endl;
memcpy(cur,head,sizeof(head));
while(res=dfs(m,inf))
{
ans+=res;
}
}
cout<<ans<<endl;
}
}