#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[10010];
struct edge{
int x,y,next;
}e[500010],g[500010];
int head[500010],head2[500010],cnt2=0,cnt=0;
int dfn[10010],low[10010],dfncnt,inst[10010],s[10010],tp=0,scc[10010],sc,sz[10010];
int rd[10010];
void insert(int x,int y){
e[++cnt]={x,y,head[x]};
head[x]=cnt;
}
void insert2(int x,int y){
g[++cnt2]={x,y,head2[x]};
head2[x]=cnt2;
rd[y]++;
}
void tarjan(int x){
dfn[x]=low[x]=++dfncnt;
s[++tp]=x;inst[x]=1;
for(int i=head[x];~i;i=e[i].next){
int y=e[i].y;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}else if(inst[y])low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
++sc;
do{
scc[s[tp]]=sc;
sz[sc]+=a[s[tp]];
inst[s[tp]]=0;
}while(s[tp--]!=x);
}
}
int ans=0,dp[10010];
queue<int> q;
void topo(){
memset(dp,0,sizeof(dp));
for(int i=1;i<=sc;i++){
if(!rd[i]){
q.push(i);
dp[i]=sz[i];
}
}
while(!q.empty()){
int x=q.front();
q.pop();ans=max(ans,dp[x]);
for(int i=head2[x];~i;i=g[i].next){
dp[g[i].y]=max(dp[g[i].y],dp[x]+sz[g[i].x]);
rd[i]--;
if(!rd[i])q.push(i);
}
}
}
int main(){
memset(dfn,0,sizeof(dfn));
memset(inst,0,sizeof(inst));
memset(head,-1,sizeof(head));
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
insert(x,y);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
memset(head2,-1,sizeof(head2));
memset(rd,0,sizeof(rd));
for(int i=1;i<=cnt;i++){
int x=scc[e[i].x],y=scc[e[i].y];
if(x!=y){
insert2(x,y);
}
}
topo();
cout<<ans;
return 0;
}