样例没过,但AC了
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,begin,end) for(ll i=(begin);i<=(end);++i)
const ll maxn=1e6+5, mod=1e9+7;
inline ll read(){
ll f=0, k=1; char ch=getchar();
while(ch<'0' || ch>'9'){ if(ch=='-') k=-1; ch=getchar();}
while(ch>='0' && ch<='9'){ f=(f<<1)+(f<<3)+(ch-'0'); ch=getchar();}
return f*k;
}
struct edge{
ll u, v;
}e[maxn];
ll n, m, len, cnt, tot, ans, head[maxn], f[maxn], dfn[maxn], low[maxn];
ll a[maxn], b[maxn], c[maxn], x[maxn], y[maxn];
bool vis[maxn];
inline void add(ll u, ll v){
e[++len].v=v;
e[len].u=head[u];
head[u]=len;
}
stack<ll> st;
void tarjan(ll u, ll fa){
dfn[u]=low[u]=++tot;
vis[u]=1;
st.push(u);
for(int i=head[u];i;i=e[i].u){
ll v=e[i].v;
if(v==fa) continue;
if(!dfn[v]) tarjan(v,u), low[u]=min(low[u],low[v]);
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
ll k;
cnt++;
do{
k=st.top();
st.pop();
a[k]=cnt;
b[cnt]+=c[k];
vis[k]=0;
}while(u!=k);
}
}
void dfs(ll u){
if(f[u]) return ;
f[u]=b[u];
ll res=0;
for(int i=head[u];i;i=e[i].u){
ll v=e[i].v;
if(!f[v]) dfs(v);
res=max(res,f[v]);
}
f[u]+=res;
}
int main(){
n = read(); m = read();
FOR(i,1,n) c[i]=read();
FOR(i,1,m){
x[i]=read(), y[i]=read();
add(x[i],y[i]);
}
FOR(i,1,n) if(!dfn[i]) tarjan(i,i);
memset(head,0,sizeof head);
memset(e,0,sizeof e);
len=0;
FOR(i,1,m) if(a[x[i]]!=a[y[i]]) add(a[x[i]],a[y[i]]);
FOR(i,1,cnt) if(!f[i]) dfs(i), ans=max(ans,f[i]);
cout << ans;
return 0;
}