rt
#include<bits/stdc++.h>
#define int long long
#define Up(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=1e6+10,M=1e6+10;
int n,m;
vector<int> e1[M],e2[M];
int a[N],dfn[N],low[N],vis[N],col[N],dis[N],cnt,idx,ans;
stack<int> st;
queue<int> q;
struct edge{
int u,v;
}ee[M];
void tarjin(int u){
dfn[u]=low[u]=++idx;
st.push(u);
vis[u]=1;
for(auto v:e1[u]){
if(dfn[v]){
low[u]=min(low[u],dfn[v]);
}else{
tarjin(v);
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]){
int v;
while(v=st.top()){
st.pop();
vis[v]=0,col[v]=u;
if(u==v) break;
a[u]+=a[v];
}
}
}
bool vv[N];
int ru[N];
signed main(){
cin.tie(0),cout.tie(0)->sync_with_stdio(0);
cin>>n>>m;
Up(i,1,n) cin>>a[i];
Up(i,1,m){
int u,v;
cin>>u>>v;
e1[u].push_back(v);
ee[i]={u,v};
}
Up(i,1,n) if(!dfn[i]) tarjin(i);
Up(i,1,m){
int u=ee[i].u,v=ee[i].v;
//cout<<u<<" "<<v<<" "<<col[u]<<" "<<col[v]<<"$$$\n";
if(col[u]!=col[v]){
e2[col[u]].push_back(col[v]);
ru[col[v]]++;
}
}
Up(i,1,n){
if(col[i]==i&&ru[i]==0) q.push(i),dis[i]=a[i];
}
while(!q.empty()){
int u=q.front();q.pop();
for(auto v:e2[u]){
dis[v]=max(dis[v],dis[u]+a[v]);
ru[v]--;
if(ru[v]==0) q.push(v);
}
}
Up(i,1,n) ans=max(ans,dis[i]);
cout<<ans<<"\n";
return 0;
}