#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
const int M=1e5+10;
struct edge{
int v,next;
}e[M];
struct Edge{
int v,next;
}E[M];
int n,m,val[N],head[N],Head[N],cnt,Cnt,a,b,dfn[N],low[N],tim,filo[N],top,scc[N],d[N],h=1,t,que[N],f[N],ans;
bool in[N];
void add(int u,int v){
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void Add(int u,int v){
E[++Cnt].v=v;
E[Cnt].next=Head[u];
Head[u]=Cnt;
d[v]++;
}
void dfs(int u){
dfn[u]=low[u]=++tim;
filo[++top]=u;
in[u]=1;
for(int i=head[u];i;i=e[i].next){
int to=e[i].v;
if(!dfn[to]){
dfs(to);
low[u]=min(low[u],low[to]);
}
else if(in[to]) low[u]=min(low[u],low[to]);
}
if(low[u]==dfn[u]){
while(filo[top]!=u){
int t=filo[top--];
val[u]+=val[t];
scc[t]=u;
in[t]=0;
}
scc[u]=u;
top--;
in[u]=0;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&val[i]);
while(m--){
scanf("%d%d",&a,&b);
add(a,b);
}
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=e[j].next)
if(dfn[i]==low[i]) if(scc[i]!=scc[e[j].v]) Add(i,e[j].v);
for(int i=1;i<=n;i++){
if(dfn[i]!=low[i]) continue;
if(!d[i]) que[++t]=i;
}
top=0;
while(h<=t){
filo[++top]=que[h];
for(int i=Head[que[h]];i;i=E[i].next){
int to=E[i].v;
d[to]--;
if(!d[to]) que[++t]=to;
}
h++;
}
for(int i=top;i>=1;i--){
for(int j=Head[filo[i]];j;j=E[j].next)
f[filo[i]]=max(f[filo[i]],f[E[j].v]);
f[filo[i]]+=val[filo[i]];
ans=max(ans,f[filo[i]]);
}
printf("%d",ans);
return 0;
}