#include<bits/stdc++.h>
using namespace std;
int n,m,ans,a[10005],dfn[10005],low[10005],iwc[10005],wa[10005],out[10005],dp[10005],cnt=1,tot=1;
vector<int>mp[10005],mp2[10005];
bool stac[10005];
queue<int>q;
stack<int>s;
void dfs(int now){
dfn[now]=low[now]=cnt++;
stac[now]=1;
s.push(now);
for(int o=0;o<mp[now].size();o++){
if(!dfn[mp[now][o]]){
dfs(mp[now][o]);
low[now]=min(low[now],low[mp[now][o]]);
}
else if(stac[mp[now][o]]){
low[now]=min(low[now],low[mp[now][o]]);
}
}
if(dfn[now]==low[now]){
while(s.size()){
iwc[s.top()]=tot;
stac[s.top()]=0;
wa[tot]+=a[s.top()];
s.pop();
}
tot++;
}
}
void crack(int now){
for(int o=0;o<mp2[now].size();o++){
out[mp2[now][o]]--;
dp[mp2[now][o]]=max(dp[mp2[now][o]],dp[now]+wa[mp2[now][o]]);
if(!out[mp2[now][o]]){
q.push(mp2[now][o]);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(m--){
int nw,nt;
cin>>nw>>nt;
mp[nw].push_back(nt);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
dfs(i);
}
}
for(int i=1;i<=n;i++){
for(int o=0;o<mp[i].size();o++){
if(iwc[i]!=iwc[mp[i][o]]){
mp2[iwc[mp[i][o]]].push_back(iwc[i]);
out[iwc[i]]++;
}
}
}
tot--;
for(int ni=1;ni<=tot;ni++){
if(!out[ni]){
q.push(ni);
dp[ni]=wa[ni];
}
}
while(q.size()){
crack(q.front());
ans=max(ans,dp[q.front()]);
q.pop();
}
cout<<ans;
return 0;
}
hope大佬will-help