#include<bits/stdc++.h>
using namespace std;
int num[10010],low[10010];
vector<int>e[10010];
int id;
int stac[10010];
int scc[10010];
int top;
int scc_id;
int f[10010];
int g[10010];
int a[10010];
int res;
void dfs(int u,int fa){
stac[++top]=u;
id++;
num[u]=id;
low[u]=id;
int sum=0;
for(int i=0;i<(int)e[u].size();i++){
int v=e[u][i];
if(num[v]==0){
dfs(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=num[v]){
g[u]=max(g[u],f[v]);
}
else {
g[u]=max(g[u],g[v]);
}
}
else if(scc[v]==0){
low[u]=min(low[u],num[v]);
}
else {
g[u]=max(g[u],f[v]);
}
}
if(num[u]==low[u]){
int cnt=0;
scc_id++;
vector<int>S;
while(top){
cnt++;
int v=stac[top];
scc[v]=scc_id;
sum+=a[v];
top--;
S.push_back(v);
if(v==u)break;
}
for(int i=0;i<(int)S.size();i++){
int x=S[i];
f[x]=sum+g[u];
}
res=max(res,f[u]);
}
}
int main(){
// freopen("1.txt","r",stdin);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
while(m--){
int x,y;
cin>>x>>y;
e[x].push_back(y);
}
for(int i=1;i<=n;i++){
if(num[i]==0){
dfs(i,0);
}
}
cout<<res;
return 0;
}
洛谷P3387