#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10;
int y[N][N],low[N],dfn[N],tot=0,sc=0,scc[N],s[N],head=0,sz[N],n,m,f[N],a[N],p[N];
bool ins[N];
vector<int>e[N];
vector<int>G[N];
void tarjan(int x){
low[x]=dfn[x]=++tot;
s[head++]=x;
ins[x]=1;
for(int i=0;i<e[x].size();i++){
int v=e[x][i];
if(!dfn[v])tarjan(v),low[x]=min(low[x],low[v]);
else if(ins[v])low[x]=min(low[x],dfn[v]);
}
if(dfn[x]<=low[x]){
sc++;
while(s[head]!=x){
sz[sc]+=a[s[head]];
scc[s[head]]=sc;
ins[s[head]]=0;
head--;
}
scc[x]=sc;
ins[x]=0;
sz[sc]+=a[x];
head--;
}
}
void top(){
queue<int>q;
for(int i=1;i<=sc;i++){
if(p[i]==0)q.push(i),f[i]=sz[i];
}
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
f[v]=max(f[v],f[u]+sz[v]);
cout<<f[v]<<endl;
p[v]--;
if(p[v]==0)q.push(v);
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
if(u!=v)e[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j=0;j<e[i].size();j++){
int v=e[i][j];
if(scc[v]!=scc[i])G[scc[i]].push_back(scc[v]),p[scc[v]]++;
}
}
int ans=0;
top();
for(int i=1;i<=n;i++)ans=max(ans,f[i]);
cout<<ans<<endl;
}