#include<bits/stdc++.h>
using namespace std;
int n,m;
queue <int> q;
vector <int> ss[600086];
vector <int> r2[600086];
int f[1000005],ne[1000005],v[1000005];
int top,cnt,cntt;
int h[1000086],r[1000005],ans[1000005];
void add(int x,int y){
ne[++top]=h[x];
f[top]=x;
v[top]=y;
h[x]=top;
}
void toto(){
for(int i=1;i<=cnt;i++){
if(r[i]==0)
q.push(i);
}
while(!q.empty()){
int k=q.front();
q.pop();
ans[++cntt]=k;
for(int i=1;i<=ss[k].size();i++){
int v=ss[k][i-1];
r[v]--;
if(r[v]==0)
q.push(v);
}
}
}
int dfn[1000086],dia[1000086],low[1000086];
int stc[1000086],cnm,vis[1000086],iop;
int dis[1000086];
void dfs(int x){
dfn[x]=low[x]=++cnm;
stc[++iop]=x;
vis[x]=1;
for(int i=h[x];i!=-1;i=ne[i]){
int j=v[i];
if(!dfn[j]){
dfs(j);
low[x]=min(low[x],low[j]);
}
else
if(v[j]){
low[x]=min(low[x],dfn[j]);
}
}
if(dfn[x]==low[x]){
cnt++;
while(1){
vis[stc[iop]]=cnt;
dia[cnt]+=dis[stc[iop]];
vis[stc[iop]]=0;
iop--;
if(x==stc[iop+1])
break;
}
}
}
int f1[1000085];
int main(){
memset(h,-1,sizeof(h));
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>dis[i];
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++){
if(!dfn[i])
dfs(i);
}
for(int i=1;i<=top;i++){
int x,y;
if(vis[f[i]]!=vis[v[i]])
{
x=vis[f[i]],y=vis[v[i]];
r[y]++;
ss[x].push_back(y),r2[y].push_back(x);
}
}
toto();
for(int i=1;i<=cnt;i++){
int g=ans[i];
f1[g]=dia[g];
for(int j=1;j<=r2[g].size();j++){
f1[g]=max(f1[g],f1[r2[g][j-1]]+dia[g]);
}
}
int anss=-1;
for(int i=1;i<=cnt;i++){
anss=max(anss,f1[i]);
}
cout<<anss;
return 0;
}