#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct star{
int to,next;
}e[N],e1[N];
bool vis[N];
int dfn[N],low[N],sck[N],fnt,num,head[N],head1[N],cnt,cnt1,n,m,dot[N],bel[N],dp[N],in[N],ans;
void add(int u,int v){
e[++cnt].next=head[u];
head[u]=cnt;
e[cnt].to=v;
}
void add1(int u,int v){
e1[++cnt1].next=head1[u];
head1[u]=cnt1;
e1[cnt1].to=v;
}
void tp_sort(){
queue<int>q;
for(int i=1;i<=n;i++){
if(!in[i]&&bel[i]==i) q.push(i),dp[i]=dot[i];
}
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=head1[t];i;i=e1[i].next){
int y=e1[i].to;
dp[y]=max(dp[y],dp[t]+dot[y]);
in[y]--;
if(!in[y]) q.push(y);
}
}
}
void Tarjan(int x){
dfn[x]=low[x]=++num;
sck[++fnt]=x;
vis[x]=true;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(!dfn[y]){
Tarjan(y);
low[x]=min(low[x],low[y]);
}else if(vis[y]) low[x]=min(low[x],low[y]);
}
if(dfn[x]==low[x]){
while(int y=sck[fnt--]){
bel[y]=x;
vis[y]=false;
if(x==y) break;
dot[x]+=dot[y];
}
}
}
void rebuild(){
for(int i=1;i<=n;i++){
for(int j=head[i];j;j=e[j].next){
int y=e[j].to;
if(bel[i]!=bel[y]){
in[bel[y]]++;
add1(bel[i],bel[y]);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>dot[i];
for(int i=1,u,v;i<=n;i++){
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
rebuild();
tp_sort();
for(int i=1;i<=n;i++){
ans=max(ans,dp[i]);
}cout<<ans<<endl;
return 0;
}
全WA掉,有没有dalao帮一下