#include<iostream>
#include<string.h>
using namespace std;
const int N=10010;
int ne[N],h[N],z[N],idx=0,a[N],n,m,x[N],y[N],d[N];
void add(int a,int b){
ne[++idx]=h[a];
h[a]=idx;
z[idx]=b;
}
int low[N],dfn[N],stck[N],jl=0,num[N],timee=0,top=0;
bool vis[N];
void tarjan(int wz){
low[wz]=dfn[wz]=++timee;
vis[wz]=1;
stck[++top]=wz;
for(int i=h[wz];i;i=ne[i]){
if(!vis[z[i]]){
tarjan(z[i]);
low[i]=min(low[i],low[z[i]]);
}
else{//it has been in
low[i]=min(low[i],low[z[i]]);
}
}
if(dfn[wz]==low[wz])
{
// jl++;
num[wz]=a[wz];
while(stck[top]!=wz){
vis[stck[top]]=0;
num[jl]+=a[top];
top--;
}
}
}
int dfs(int wz){
if(d[wz])
return d[wz];
int maxx=-1;
d[wz]=num[wz];
for(int i=h[wz];i;i=ne[i]){
if(!d[z[i]]){
maxx=max(maxx,dfs(z[i]));
}
else
maxx=max(maxx,d[z[i]]);
}
return maxx;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
// int x,y;
cin>>x[i]>>y[i];
// r[y]++;
add(x[i],y[i]);
}
for(int i=1;i<=n;i++)
tarjan(i);
memset(ne,0,sizeof(ne));
memset(h,0,sizeof(h));
memset(z,0,sizeof(z));
// memset(vis,0,sizeof(vis));
int maxx=-1;
// for(int i=1;i<=jl;i++){
// maxx=max(maxx,num[i]);
// }
for(int i=1;i<=m;i++){
if(low[x[i]]!=low[y[i]]){
add(x[i],y[i]);
}
}
for(int i=1;i<=n;i++){
if(!d[i]){
maxx=max(maxx,dfs(i));
}
}
cout<<maxx;
return 0;
}