代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
int from,to;
}e[100005];
stack<int>st;
int n,m,SCC[100005],dfn[100005],sum,ru[100005];
int ans[100005],low[100005],tot,v[100005],nv[100005];
vector<int>a[100005];
vector<int>b[100005];
queue<int>q;
bool vis[100005],used[100005];
int dp[10005];
void tarjan(int now){
vis[now]=true;
st.push(now);
dfn[now]=low[now]=++tot;
for(int i=0;i<a[now].size();i++){
if(!vis[a[now][i]]){
tarjan(a[now][i]);
low[now]=min(low[now],low[a[now][i]]);
}
else{
low[now]=min(low[now],dfn[a[now][i]]);
}
}
if(low[now]==dfn[now]){
sum++;
while(!st.empty()&&st.top()!=now){
SCC[st.top()]=sum;
st.pop();
}
SCC[now]=sum;
st.pop();
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>v[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
e[i].from=u;
e[i].to=v;
a[u].push_back(v);
}
tarjan(1);
for(int i=1;i<=n;i++){
nv[SCC[i]]+=v[i];
}
for(int i=1;i<=m;i++){
if(SCC[e[i].from]!=SCC[e[i].to]){
b[SCC[e[i].from]].push_back(SCC[e[i].to]);
ru[SCC[e[i].to]]++;
}
}
for(int i=1;i<=sum;i++){
if(!ru[i]){
q.push(i);
dp[i]=nv[i];
}
}
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=0;i<b[t].size();i++){
dp[b[t][i]]=max(dp[b[t][i]],dp[t]+nv[b[t][i]]);
ru[b[t][i]]--;
if(!ru[b[t][i]]){
q.push(b[t][i]);
}
}
}
int ans=0;
for(int i=1;i<=sum;i++){
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}