#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define int long long
int n,m,a[N],head[N<<1],cnt,dfn[N],tot,c[N],low[N],tim,st[N],top,sum[N],head1[N<<1],cnt1;
struct node{int to,nxt;}e[N<<1],e1[N<<1];
void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;}
void add1(int u,int v){e1[++cnt1].to=v;e1[cnt1].nxt=head1[u];head1[u]=cnt1;}
void tarjan(int x){
dfn[x]=low[x]=++tim;
st[++top]=x;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}else if(!c[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x]){
c[x]=++tot;
sum[tot]+=a[x];
while(st[top]!=x){
c[st[top]]=tot;
sum[tot]+=a[st[top--]];
}
top--;
}
}
int in[N],dis[N];
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j=head[i];j;j=e[j].nxt){
int v=e[i].to;
if(c[i]!=c[v]){
add1(c[i],c[v]);
in[c[v]]++;
}
}
}
queue<int> q;
for(int i=1;i<=tot;i++){
dis[i]=sum[i];
if(!in[i])q.push(i);
}
while(q.size()){
int u=q.front();
q.pop();
for(int i=head1[u];i;i=e1[i].nxt){
int v=e1[i].to;
dis[v]=max(dis[v],dis[u]+sum[v]);
in[v]--;
if(!in[v])q.push(v);
}
}
int ans=0;
for(int i=1;i<=tot;i++){
ans=max(ans,dis[i]);
}
cout<<ans;
return 0;
}