#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>#include<string>#include<queue>#include<vector>#define ll long longusingnamespace std;constint M =300500;constint N =30050;int n, m;int tot =0, a, b, tim =0, top =0;int sum[N], col[N], dfs[N], low[N], zhan[N], v[N];struct node {int to, nxt;} p[M];int cnt =-1, fi[N];voidaddline(int x,int y){p[++cnt]=(node){ y, fi[x]};fi[x]= cnt;}voidtarjan(int x){dfs[x]= low[x]=++tim;zhan[++top]= x;for(int i = fi[x];~i; i = p[i].nxt){int v = p[i].to;if(dfs[v]==0){tarjan(v);low[x]=min(low[x], low[v]);}elseif(col[v]==0)low[x]=min(low[x], low[v]);}if(low[x]== dfs[x]){col[x]=++tot;sum[tot]= v[x];while(zhan[top]!= x){col[zhan[top]]= tot;sum[tot]+= v[zhan[top--]];}top--;}return;}int dp[N], ru[N];voidtopu(){queue<int> q;for(int i = n +1; i <= tot; i++){if(ru[i]==0)q.push(i);}while(!q.empty()){int now = q.front();q.pop();dp[now]=max(dp[now], sum[now]);for(int i = fi[now];~i; i = p[i].nxt){int v = p[i].to;dp[v]=max(dp[v], dp[now]+ sum[v]);ru[v]--;if(ru[v]==0)q.push(v);}}}intmain(){scanf("%d%d",&n,&m);tot = n;//以后的縮點編號從m+1開始for(int i =1; i <=3* n; i++) fi[i]=-1;for(int i =1; i <= n; i++){scanf("%d",&v[i]);}for(int i =1; i <= m; i++){scanf("%d%d",&a,&b);addline(a, b);}for(int i =1; i <= n; i++){if(dfs[i]==0)tarjan(i);}for(int i =1; i <= n; i++){for(int j = fi[i];~j; j = p[j].nxt){int u = p[j].to;if(col[i]!= col[u]){addline(col[i], col[u]);ru[col[u]]++;}}}topu();int ans =0;for(int i = n +1; i <= tot; i++){ans =max(ans, dp[i]);}printf("%d\n", ans);return0;}/*
1
3 3 3 3 3 3 3 3 3 3
*/