#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[10010];
vector<int> e[100010],vec[10010];
int idx,cnt,dfn[10010],sccno[10010],low[10010],dp[10010];
long long val[10010];
vector<vector<int> >scc;
stack<int>s;
void dfs(int u){
dfn[u]=++idx;
low[u]=dfn[u];
s.push(u);
for(auto v:e[u]){
if(!dfn[v]){
dfs(v);
low[u]=min(low[v],dfn[u]);
}
else if(!sccno[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
++cnt;
while(true){
int v=s.top();
s.pop();
vec[cnt].push_back(v);
sccno[v]=cnt;
val[cnt]+=a[v];
if(v==u)break;
}
}
}
int 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;
e[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!sccno[i])dfs(i);
}
int ans=0;
for(int i=1;i<=cnt;i++){
dp[i]=val[i];
for(int u:vec[i]){
for(int v:e[u]){
if(sccno[v]==sccno[u])continue;
else dp[i]=max(dp[i],(int)(dp[sccno[v]]+val[i]));
}
}
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}