rt
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e4+10,M=1e5+10;
int ans=-0x3f3f3f3f;
int cnt,n,m,head[N],nxt[M],from[M],to[M],v[N];
namespace answer{
int cnt,n,m,head[N],nxt[M],to[M],in[N];
}
void add2(const int u,const int v){
answer::nxt[++answer::cnt]=answer::head[u];
answer::to[answer::cnt]=v;
answer::head[u]=answer::cnt;
}
int dfn[N],low[N],stk[N],tp,inStk[N],timer;
int scc[N],sc;
void add(const int u,const int v){
nxt[++cnt]=head[u];
from[cnt]=u;
to[cnt]=v;
head[u]=cnt;
}
void TarjanSCC(int u){
dfn[u]=low[u]=++timer;
stk[++tp]=u;
inStk[u]=1;
for(int i=head[u];i;i=nxt[i])
if(!dfn[to[i]])
TarjanSCC(to[i]),
low[u]=min(low[u],low[to[i]]);
else if(inStk[to[i]])
low[u]=min(low[u],low[to[i]]);
if(dfn[u]==low[u]){
sc++;
while(stk[tp]!=u){
v[u]+=v[stk[tp]];
scc[stk[tp]]=sc;
inStk[stk[tp--]]=0;
}
scc[stk[tp]]=sc;
inStk[stk[tp--]]=0;
}
}
int f[N];
int topsort(int u){
if(f[u])
return f[u];
f[u]=v[u];
for(int i=answer::head[u];i;i=answer::nxt[i])
f[u]=max(f[u],topsort(answer::to[i])+v[i]);
return f[u];
}
int dfs(int u){
int t=1;
for(int i=answer::head[u];i;i=answer::nxt[i])
t=max(t,dfs(answer::to[i])+1);
return t;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",v+i);
for(int i=1,u,v;i<=m;i++)
scanf("%d%d",&u,&v),
add(u,v);
for(int i=1;i<=n;i++)
if(!dfn[i])
TarjanSCC(i);
for(int i=1;i<=cnt;i++){
if(scc[from[i]]!=scc[to[i]]){
add2(from[i],to[i]);
answer::in[to[i]]++;
}
}
for(int i=1;i<=n;i++)
if(answer::in[i]==0)
ans=max(ans,topsort(i));
printf("%d",ans);
return 0;
}