#include
#include
#include
#define INF 0x7fffffff
#define MAXV 1000
#define MAXE 20000
using namespace std;
struct edge
{
int to,c,next;
}e[MAXE<<3];
int size,head[MAXV];
void addedge(int from,int to,int c)
{
e[size].to=to;
e[size].c = c;
e[size].next=head[from];
head[from]=size++;
e[size].to=from;
e[size].c=0;
e[size].next=head[to];
head[to]=size++;
}
int n,m,s,d;
int cost[MAXV];
int dis[MAXV],gap[MAXV],cur[MAXV],pre[MAXV];
int SAP_GAP()
{
int cur_flow,flow_ans=0,neck,u,tmp,i;
int start=s*2-1,end=d*2,N=n*2;
memset(dis,0,sizeof(dis));memset(gap,0,sizeof(gap));
memset(pre,-1,sizeof(pre));
for(i=0;i<=N;i++)
cur[i]=head[i];
gap[0]=N;
u=start;
while(dis[start]<N)
{
if(u==end)
{ cur_flow=INF;
for(i=start;i!=end;i=e[cur[i]].to)
if(cur_flow>e[cur[i]].c)
{
cur_flow=e[cur[i]].c;
neck=i;
}
for(i=start;i!=end;i=e[cur[i]].to)
{ tmp=cur[i];
e[tmp].c-=cur_flow;
e[tmp^1].c+=cur_flow;
}
flow_ans+=cur_flow;
u=neck;
}
for(i=cur[u];i!=-1;i=e[i].next)
if(e[i].c&&dis[u]==dis[e[i].to]+1)
break;
if(i!=-1)
{
cur[u]=i;
pre[e[i].to]=u;
u=e[i].to;
}
else
{
if(--gap[dis[u]]==0) break;
cur[u]=head[u];
for(tmp=N,i=head[u];i!=-1;i=e[i].next)
if(e[i].c)
tmp=min(tmp,dis[e[i].to]);
dis[u]=tmp+1;
gap[dis[u]]++;
if(u!=start) u=pre[u];
}
}
return flow_ans;
}
void init()
{ int from,to;
size=0;
memset(head,-1,sizeof(head));
memset(cost,0,sizeof(cost));
scanf("%d%d",&s,&d);
for(int i=1;i<=n;i++)
{
scanf("%d",&cost[i]);
addedge(i*2-1,i*2,cost[i]);
//addedge(i*2,i*2-1,cost[i]);
}
for(int i=1;i<=m;i++)
{ scanf("%d%d",&from,&to);
addedge(from*2,to*2-1,INF);
addedge(to*2,from*2-1,INF);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
printf("%d\n",SAP_GAP());
}
return 0;
}