#include<bits/stdc++.h>
using namespace std;
const int N=2e4;
int n,m,a[N];
int he[N],ne[N],u[2*N],e[2*N],cnt,ooo;
int dfn[N],low[N],sd[N],ti;
int vis[N],stck[N],top,in[N],dis[N];
void add(int x,int y){
ne[++cnt]=he[x];
he[x]=cnt;
e[cnt]=y;
u[cnt]=x;
}
void tarjan(int x){
ooo++;
dfn[x]=low[x]=++ti;
vis[x]=1,stck[++top]=x;
for(int i=he[x];i;i=ne[i]){
if(!dfn[e[i]]){
tarjan(e[i]);
low[x]=min(low[e[i]],low[x]);
}
else if(vis[e[i]]){
low[x]=min(low[e[i]],low[x]);
}
}
if(dfn[x]==low[x]){
int y;
while(y=stck[top--]){
vis[y]=0;
sd[y]=x;
if(x==y) break;
a[x]+=a[y];
}
}
}
int topo(){
queue<int> p;
for(int i=1;i<=n;i++){
if(i==sd[i]&&!in[i]){
dis[i]=a[i];
p.push(i);
}
}
while(!p.empty()){
int now=p.front();
p.pop();
for(int i=he[now];i;i=ne[i]){
dis[e[i]]=max(dis[e[i]],dis[now]+a[e[i]]);
in[e[i]]--;
if(!in[e[i]]) p.push(e[i]);
}
}
int ans=-1e7;
for(int i=1;i<=n;i++) ans=max(ans,dis[i]);
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
add(l,r);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
cnt=0;
memset(he,0,sizeof he);
for(int i=1;i<=m;i++){
int x=sd[u[i]],y=sd[e[i]];
if(x!=y){
ne[++cnt]=he[x];
he[x]=cnt;
e[cnt]=y,u[cnt]=x;
in[y]++;
}
}
printf("%d",topo());
return 0;
}