#include<bits/stdc++.h>
using namespace std;
const int N=1e4+100;
const int M=1e5+100;
int p[N];
int dfn[N],low[N],tot;
int head[N],nxt[M],to[M];
int st[N],top;
bool in[N];
int scc[N],SCC,q[N],fr[M];
int d[N],dp[N];
void dfs(int k){
dfn[k]=++tot;
low[k]=dfn[k];
st[++top]=k;
st[++top]=k;
in[k]=true;
for(int i=head[k];i;i=nxt[i]){
int v=to[i];
if(!dfn[v]){
dfs(v);
low[k]=min(low[k],low[v]);
} else
if(in[v])
low[k]=min(low[k],low[v]);
}
if(dfn[k]==low[k]){
in[k]=false;
scc[k]=++SCC;
while(st[top]!=k){
q[SCC]+=p[st[top]];
scc[st[top]]=SCC;
in[st[top--]]=false;
}
top--;
}
}
int main(){
int n,m,x,y;
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",p+i);
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
fr[i]=x;
to[i]=y;
nxt[i]=head[x];
head[x]=i;
}
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i);
memset(head,0,sizeof(head));
for(int i=1;i<=m;i++){
x=scc[fr[i]];
y=scc[to[i]];
if(x==y)
continue;
nxt[i]=head[x];
head[x]=i;
to[i]=y;
++d[y];
}
queue<int>que;
for(int i=1;i<=SCC;i++)
if(!d[i])
que.push(i);
int ans=0;;
while(!que.empty()){
int k=que.front();
que.pop();
dp[k]+=q[k];
ans=max(ans,dp[k]);
for(int i=head[k];i;i=nxt[i]){
dp[to[i]]=max(dp[to[i]],dp[k]);
if(!--d[to[i]])
que.push(to[i]);
}
}
cout<<ans<<endl;
return 0;
}