#include<bits/stdc++.h>
using namespace std;
const int N=100005,M=5*N;
int n,m;
int a[N];
int hd[N],nxt[M],to[M],tot;
int hd2[N],nxt2[M],to2[M],tot2,rd[N];
int st[N],idx,dfn[N],low[N],ins[N],cnt;
int dis[N];
int ans=0,res;
int tup[N],cntt;
int b[N];
int dp[N];
void add(int x,int y){
tot++;
to[tot]=y;
nxt[tot]=hd[x];
hd[x]=tot;
}
void add2(int x,int y){
tot2++;
to2[tot2]=y;
nxt2[tot2]=hd2[x];
hd2[x]=tot2;
rd[y]++;
}
void Tarjan(int now){
dfn[now]=++cnt;
low[now]=cnt;
st[++idx]=now;
ins[idx]=1;
for(int i=hd[now];i;i=nxt[i]){
int v=to[i];
if(!dfn[v]){
Tarjan(v);
low[now]=min(low[now],low[v]);
}
else if(ins[v]){
low[now]=min(low[now],dfn[v]);
}
}
if(low[now]==dfn[now]){
res++;
do{
int aaa=st[idx--];
ins[aaa]=0;
dis[res]+=a[aaa];
b[aaa]=res;
}while(st[idx]!=now&&idx>=1);
int aaa=st[idx--];
ins[aaa]=0;
dis[res]+=a[aaa];
b[aaa]=res;
}
}
void topo(){
queue<int>s;
for(int i=1;i<=res;i++){
if(rd[i]==0){
s.push(i);
}
}
while(!s.empty()){
int aaa=s.front();
tup[++cntt]=aaa;
s.pop();
for(int i=hd[aaa];i;i=nxt[i]){
int v=to[i];
if(rd[v]>0){
rd[v]--;
if(rd[v]==0){
s.push(v);
}
}
}
}
}
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>>y;
add(x,y);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
Tarjan(i);
}
}
for(int i=1;i<=n;i++){
for(int j=hd[i];j;j=nxt[j]){
if(b[i]!=b[j]){
add2(b[i],b[j]);
}
}
}
topo();
for(int i=1;i<=cntt;i++){
int u=tup[i];
dp[u]=dis[u];
for(int j=hd[u];j;j=nxt[j]){
int v=to[j];
dp[v]=max(dp[v],dp[u]+dis[v]);
}
}
for(int i=1;i<=cntt;i++){
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}