#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10,mod=1e9+7;
inline int read(){
int c,w=0,n=0;
while((c=getchar())<'0'||'9'<c) w=c=='-';
do n=n*10+c-'0';while('0'<=(c=getchar())&&c<='9');
return w?-n:n;
}
inline int write(int n){
if(n<0) putchar('-'),n=-n;
if(n>9) write(n/10);
putchar(n%10+'0');
return n;
}
int n=read(),m=read(),ans,tot,root[maxn],top,sum[maxn],a[maxn],p[maxn];
set<int> edge[maxn];
int dfsn[maxn],low[maxn],flag[maxn];
void tarjan(int x){
dfsn[x]=++tot,p[x]=x;
for(int i:edge[x]) if(!flag[i]){
if(!dfsn[i]) tarjan(i);
if(dfsn[i]<dfsn[x]) dfsn[x]=dfsn[i],p[x]=p[i];
}
flag[x]=1;
}
void dfs(int x){
if(p[x]==-1) return;
int mx=0;
for(int i:edge[x]) if(p[i]){
dfs(i);
mx=max(mx,a[i]);
}
a[x]+=mx,p[x]=-1;
}
signed main(){
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=m;++i){
int u=read(),v=read();
edge[u].insert(v);
}
for(int i=1;i<=n;++i) if(!flag[i]) tarjan(i);
for(int i=1;i<=n;++i) if(p[i]!=i){
for(int j:edge[i]) if(j!=p[i]) edge[p[i]].insert(j);
a[p[i]]+=a[i],a[i]=0,edge[i].clear();
}
for(int i=1;i<=n;++i){
dfs(i);
ans=max(ans,a[i]);
}
write(ans);
return 0;
}