#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int h[maxn],w[maxn],nex[maxn],e[maxn],idx;
int vh[maxn],vw[maxn],vnex[maxn],ve[maxn],vidx;
int n,m,sz[maxn],in[maxn];
int dfn[maxn],low[maxn],top,val[maxn];
int instk[maxn],stk[maxn],id[maxn],cnt,timestep;
queue<int>q;
void add(int x,int y){
e[++idx]=y;
nex[idx]=h[x];
h[x]=idx;
}
void vadd(int x,int y){
ve[++vidx]=y;
vnex[vidx]=vh[x];
vh[x]=vidx;
}
void tarjan(int u){
dfn[u]=low[u]=++timestep;
stk[++top]=u;
instk[u]=1;
for(int i=h[u];i;i=nex[i]){
int j=e[i];
if(!dfn[j]){
tarjan(j);
low[u]=min(low[u],low[j]);
}
else if(instk[j])low[u]=min(low[u],dfn[j]);
}
if(low[u]==dfn[u]){
++cnt;
int y;
do{
y=stk[top--];
instk[y]=0;
id[y]=cnt;
sz[cnt]+=val[y];
}while(y!=u);
//sz[cnt]+=val[u];
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>val[i];
}
int x,y;
for(int i=1;i<=m;i++){
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++){
for(int j=h[i];j;j=nex[j]){
int k=e[j];
if(id[k]!=id[i]){
vadd(id[i],id[k]);
in[k]++;
}
}
}
int ans=0;
for(int i=1;i<=cnt;i++){
w[i]=sz[i];
if(in[i]==0)q.push(i),ans=max(ans,w[i]);
}
while(q.size()){
int top=q.front();
q.pop();
for(int i=vh[top];i;i=vnex[i]){
int j=ve[i];
w[j]=max(w[j],sz[j]+w[top]);
ans=max(ans,w[j]);
in[j]--;
if(in[j]==0)q.push(j);
}
}
cout<<ans<<endl;
}