#include<bits/stdc++.h>
using namespace std;
int m,u,v,head2[200009],in[200009],dis[200009],n,p[200009],h[200009],vis[200009],tot,cnt,head[200009],low[200009],tim,dfn[200009];
stack<int> st;
struct ghj{
int from,to,next;
}edge[200009],edge2[200009];
void add(int x,int y){
edge[++tot].next=head[x];
edge[tot].to=y;
edge[tot].from=x;
head[x]=tot;
}
void tarjan(int x){
low[x]=dfn[x]=++tim;
st.push(x);
vis[x]=1;
for(int i=head[x];i;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[x]=min(low[x],low[v]);
}
else
if(vis[v]) low[x]=min(low[x],low[v]);
}
if(dfn[x]==low[x]){
int y;
while(st.size()){
y=st.top();
st.pop();
h[y]=x;
vis[y]=0;
if(x==y) break;
p[x]+=p[y];
}
}
}
int topo(){
queue<int> q;
int tot=0;
for(int i=1;i<=n;i++){
if(h[i]==i && !in[i]){
q.push(i);
dis[i]=p[i];
}
}
while(q.size()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=edge2[i].next){
int v=edge2[i].to;
dis[v]=max(dis[v],dis[x]+p[v]);
if((--in[v])==0) q.push(v);
}
}
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,dis[i]);
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<=m;i++){
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=m;i++){
int x=h[edge[i].from],y=h[edge[i].to];
if(x!=y){
edge2[++cnt].next=head2[x];
edge2[cnt].to=y;
head2[x]=cnt;
in[y]++;
}
}
cout<<topo();
}