#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool instack[10005];
int tot=0,n,m;
int sum[10005],g[10005],s[10005];
bool vis[10005];
int ans[10005];
vector<int> edge[10005],edge2[10005];
stack<int> stk;
void tarjan(int u){
g[u]=++tot;
int k=tot;
instack[u]=1;
stk.push(u);
for(int i:edge[u]){
if(g[i]==0){
tarjan(i);
g[u]=min(g[u],g[i]);
}
if(instack[i]&&g[i])g[u]=min(g[u],g[i]);
}
if(k==g[u]){
while(stk.top()!=u){
g[stk.top()]=u;
stk.pop();
}
stk.pop();
}
}
int dfs(int u){
int re=0;
if(vis[u])return ans[u];
vis[u]=1;
for(int i:edge2[u])re=max(re,dfs(i));
return ans[u]=re+sum[u];
}
int find(int u){
if(g[u]==u)return g[u];
return g[u]=find(g[u]);
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
edge[a].push_back(b);
}
for(int i=1;i<=n;i++)if(g[i]==0)tarjan(i);
for(int i=1;i<=n;i++){
sum[g[i]]+=s[i];
for(int j:edge[i])if(g[i]!=g[j])edge2[g[i]].push_back(g[j]);
}
int anss=0;
for(int i=1;i<=n;i++)anss=max(anss,dfs(g[i]));
cout<<anss;
}