#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxn=1e4+5;
int n,m,tot,ans;
int a[maxn],X[maxn],Y[maxn],mark[maxn],sum[maxn],dp[maxn];
bool vis[maxn];
stack<int> st;
vector<int> v[maxn],v2[maxn],v3[maxn];
void dfs(int k){
vis[k]=1;
for(int i=0;i<v[k].size();i++)
if(!vis[v[k][i]])
dfs(v[k][i]);
st.push(k);
}
void dfs2(int k){
mark[k]=tot;
sum[tot]+=a[k];
for(int i=0;i<v2[k].size();i++)
if(!mark[v2[k][i]])
dfs2(v2[k][i]);
return ;
}
void Kosaraju(){
for(int i=1;i<=n;i++)
if(!vis[i])
dfs(i);
while(st.size()){
int x=st.top();
st.pop();
if(!mark[x]){
tot++;
dfs2(x);
}
}
return ;
}
void dfs3(int k){
dp[k]=sum[k];
for(int i=0;i<v[k].size();i++)
if(!mark[v[k][i]]){
dfs3(v[k][i]);
dp[k]+=dp[v[k][i]];
}
}
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]);
v[X[i]].push_back(Y[i]);
v2[Y[i]].push_back(X[i]);
}
Kosaraju();
for(int i=1;i<=m;i++)
if(mark[X[i]]!=mark[Y[i]])
v3[X[i]].push_back(Y[i]);
for(int i=1;i<=tot;i++)
if(!dp[i]){
dfs3(i);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}