#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+100;
int n,m,cnt,dfcnt,dfn[MAXN],hd[MAXN],nxt[MAXN],to[MAXN],val[MAXN],low[MAXN],vis[MAXN];
int sc,scc[MAXN],sz[MAXN],bto[MAXN],d[MAXN],fro[MAXN],t[MAXN];
int hd2[MAXN],nxt2[MAXN],to2[MAXN],cnt2;
struct stac{
int q[MAXN],tp;
inline void init(){tp=0;}
inline int top(){return q[tp];}
inline void push(int x){q[++tp]=x;}
inline void pop(){tp--;}
inline int size(){return tp;}
inline bool empty(){return tp>0?false:true;}
}st;
struct Queue{
int q[MAXN],h,tail;
inline void init(){tail=h=0;}
inline int front(){return q[h+1];}
inline int back(){return q[tail];}
inline void push(int x){q[++tail]=x;}
inline void pop(){h++;}
inline int size(){return tail-h;}
inline bool empty(){return h<tail?false:true;}
}q;
inline int mymin(int a,int b){return a<b?a:b;}
inline int mymax(int a,int b){return a>b?a:b;}
inline void add(int u,int v){
cnt++;
to[cnt]=v;
nxt[cnt]=hd[u];
hd[u]=cnt;
}
inline void add2(int u,int v){
cnt2++;
to2[cnt2]=v;
nxt2[cnt2]=hd2[u];
hd2[u]=cnt2;
}
inline void tarjan(int x){
low[x]=dfn[x]=++dfcnt;
st.push(x);
vis[x]=1;
for(int i=hd[x];i;i=nxt[i]){
if(dfn[to[i]]==0){
tarjan(to[i]);
low[x]=mymin(low[x],low[to[i]]);
}
else if(vis[to[i]]!=0) low[x]=mymin(low[x],dfn[to[i]]);
}
if(dfn[x]==low[x]){
sc++;
while(!st.empty()){
scc[st.top()]=sc;
sz[sc]++;
vis[st.top()]=0;
if(x==st.top()){
st.pop();
break;
}
val[x]+=val[st.top()];
st.pop();
}
scc[st.top()]=sc;
sz[sc]++;
vis[st.top()]=0;
st.pop();
}
}
inline int query(){
int res=0;
q.init();
for(int i=1;i<=n;i++) if(scc[i]==i&&!bto[i]){
q.push(i);
d[i]=val[i];
}
while(!q.empty()){
int ff=q.front();q.pop();
for(int i=hd2[ff];i;i=nxt2[i]){
int v=to2[i];
d[v]=mymax(d[v],d[ff]+val[v]);
bto[v]--;
if(bto[v]==0) q.push(v);
}
}
for(int i=1;i<=n;i++) res=mymax(res,d[i]);
return res;
}
int main(){
st.init();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&val[i]);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
fro[i]=u,t[i]=v;
}
for(int i=1;i<=n;i++) if(dfn[i]==0) tarjan(i);
for(int i=1;i<=m;i++){
int x=scc[fro[i]],y=scc[t[i]];
if(x!=y){
add2(x,y);
bto[y]++;
}
}
printf("%d",query());
return 0;
}