#include<cstdio>#include<stack>#include<cstring>#include<queue>#define maxn 1000005usingnamespace std;struct node{int to, next;}e[maxn];int n, m, head[maxn], tot =0, Index =0, cnt =0;bool vis[maxn];int dfn[maxn], low[maxn], val[maxn];
stack <int> s;voidaddedge(int u,int v){ e[++tot]=(node){ v, head[u]}; head[u]= tot;}int color[maxn], sum[maxn];voidTarjan(int cur){
s.push(cur);
vis[cur]=true;
dfn[cur]= low[cur]=++Index;for(int i = head[cur]; i; i = e[i].next){if(!dfn[e[i].to]){Tarjan(e[i].to);
low[cur]=min(low[cur], low[e[i].to]);}else{if(vis[e[i].to]) low[cur]=min(low[cur], dfn[e[i].to]);}}if(dfn[cur]== low[cur]){
cnt++;int tmp =0;while(tmp != cur){
tmp = s.top();
s.pop();
color[tmp]= cnt;
sum[cnt]+= val[tmp];
vis[tmp]=false;}}}int dis[maxn], ans =0;voiddp(int cur){
dis[cur]= sum[cur];int Max =0;for(int i = head[cur]; i; i = e[i].next){if(!dis[e[i].to])dp(e[i].to);
Max =max(Max, dis[e[i].to]);}
dis[cur]+= Max;}int x[maxn], y[maxn];intmain(){scanf("%d%d",&n,&m);for(int i =1; i <= n; i++)scanf("%d",&val[i]);for(int i =1; i <= m; i++){scanf("%d%d",&x[i],&y[i]);addedge(x[i], y[i]);}for(int i =1; i <= n; i++)if(!dfn[i])Tarjan(i);
tot =0;memset(e,0,sizeof e);memset(vis,false,sizeof vis);memset(head,0,sizeof head);for(int i =1; i <= m; i++){if(color[x[i]]!= color[y[i]]){addedge(color[x[i]], color[y[i]]);}}for(int i =1; i <= cnt; i++)if(!dis[i])dp(i), ans =max(ans, dis[i]);printf("%d\n", ans);return0;}