rt。WA4,5,7。
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5,M=1e5+5;
struct path{int u,v;};
int n,m,tot,ans,a[N],f[N],dp[N],ord[N];
path w[M];
bitset<N> vis1,vis2;
vector<int> mem,fa[N],ch[N],member[N];
unordered_set<int> new_fa[N];
void dfs1(int p){
if(vis1[p]) return;
vis1[p]=1;
for(int i(0);i<ch[p].size();++i) dfs1(ch[p][i]);
mem.push_back(p);
}
void dfs2(int p,int fr){
if(vis2[p]) return;
vis2[p]=1;
for(int i(0);i<fa[p].size();++i) dfs2(fa[p][i],fr);
f[fr]+=a[p],ord[p]=fr,member[fr].push_back(p);
}
int s(int p){
if(dp[p]) return dp[p];
int mem(0);
for(auto it=new_fa[p].begin();it!=new_fa[p].end();++it) mem=max(mem,s(*it));
mem+=f[p];
return dp[p]=mem;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i(1);i<=n;++i) cin >> a[i];
for(int i(1),u,v;i<=m;++i) cin >> w[i].u >> w[i].v,ch[w[i].u].push_back(w[i].v),fa[w[i].v].push_back(w[i].u);
for(int i(1);i<=n;++i) dfs1(i);
for(int i(0);i<mem.size();++i) if(!vis2[i]) ++tot,dfs2(i,tot);
for(int i(1);i<=tot;++i){
for(int j(0);j<member[i].size();++j){
for(int k(0);k<fa[member[i][j]].size();++k) if(ord[fa[member[i][j]][k]]!=i) new_fa[i].insert(ord[fa[member[i][j]][k]]);
}
}
for(int i(1);i<=tot;++i) ans=max(ans,s(i));
cout << ans;
return 0;
}