#include<bits/stdc++.h>
#define int long long
const int N = 1e4+5;
using namespace std;
int n,m,a[N],b[N];
vector<int>mp[N],mp2[N];
stack<int>sp;
int tot,cnt;
int scc[114514],dfn[114514],low[114514];
int dp[N],in[N];
bool instack[N],vis[N];
void tarjan(int i){
dfn[i] = low[i] = ++tot;
instack[i] = 1;
sp.push(i);
for(auto x : mp[i]){
if(!dfn[x])
{
tarjan(x);
low[i] = min(low[i],low[x]);
}else if(instack[x]){
low[i] = min(low[i],dfn[x]);
}
}
if(low[i] == dfn[i])
{
++cnt;
while(sp.top()!= i)
{
scc[sp.top()] = cnt;
instack[sp.top()]= 0;
b[cnt]+=a[sp.top()];
sp.pop();
}
scc[i]=cnt;
instack[i] = 0;
b[cnt]+=a[i];
sp.pop();
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1,a,b;i<=m;i++){
cin>>a>>b;
mp[a].push_back(b);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
for(int v:mp[i]){
if(scc[i]!=scc[v])
{
mp2[scc[i]].push_back(scc[v]);
in[scc[v]]++;
}
}
}
queue<int>q;
for(int i=1;i<=cnt;i++){
if(in[i]==0){
q.push(i);
dp[i] = b[i];
}
}
int ans=0;
while(!q.empty()){
int t=q.front();q.pop();
ans=max(ans,dp[t]);
for(auto x:mp2[t]){
dp[x] = max(dp[x],dp[t]+b[x]);
in[x]--;
if(in[x]==0){
q.push(x);
}
}
}
cout<<ans;
return 0;
}