#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define N 100100
#define M 1000100
using namespace std;
int n,m;
int Root[N],Next[N],v[M],cnt;
int a[N],s[N],top,dfn[N],low[N],scc[N],dfscnt,scccnt;
int q[N],r[N],tail;
int X[N],Y[N],f[N];
inline void add(int _u,int _v)
{
v[++cnt]=_v;
Next[cnt]=Root[_u];
Root[_u]=cnt;
}
inline void tarjan(int u)
{
dfn[u]=low[u]=++dfscnt;
s[top++]=u;
for(int x=Root[u];x!=0;x=Next[x]){
if(!dfn[v[x]]){
tarjan(v[x]);
low[u]=min(low[v[x]],low[u]);
}else if(!scc[v[x]])low[u]=min(low[u],dfn[v[x]]);
}
if(dfn[u]==low[u]){
scccnt++;
do{
scc[s[--top]]=scccnt;
if(s[top]!=u)a[scccnt]+=a[s[top]];
}while(s[top]!=u);
}
}
int topo()
{
tail=0;
for(int i=1;i<=scccnt;++i)
if(r[i]==0)q[++tail]=i,f[i]=a[i];
for(int head=1;head<=tail;++head){
int u=q[head];
for(int x=Root[u];x!=0;x=Next[x]){
f[v[x]]=max(f[v[x]],f[u]+a[v[x]]);
r[v[x]]--;
if(r[v[x]]==0)q[++tail]=v[x];
}
}
int ans=0;
for(int i=1;i<=scccnt;++i)ans=max(ans,f[i]);
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int i=1;i<=m;++i){
scanf("%d %d",&X[i],&Y[i]);
add(X[i],Y[i]);
}
for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i);
memset(Root,0,sizeof Root);
memset(Next,0,sizeof Next);
memset(v,0,sizeof v);
cnt=0;
for(int i=1;i<=m;++i)
if(scc[X[i]]!=scc[Y[i]]){
add(scc[X[i]],scc[Y[i]]);
r[scc[Y[i]]]++;
}
printf("%d",topo());
return 0;
}