#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
const int N=1e4+5,M=1e5+5;
int a[N],scc[N],val[N],dfn[N],low[N],d[N],dist[N],n,m,u,v,cnt,tot,ans;
bool vis[N];
vector<int> G[N],H[N];
stack<int> st;
queue<int> q;
void tarjan(int idx){
dfn[idx]=low[idx]=++cnt;
st.push(idx);
vis[idx]=true;
for(int nxt=0;nxt<G[idx].size();nxt++){
if(!dfn[nxt]){
tarjan(nxt);
low[idx]=min(low[idx],low[nxt]);
}else if(vis[nxt]){
low[idx]=min(low[idx],dfn[nxt]);
}
}
if(dfn[idx]==low[idx]){
++tot;
while(st.top()!=idx){
vis[st.top()]=false;
scc[st.top()]=tot;
val[tot]+=a[st.top()];
st.pop();
}
vis[st.top()]=false;
scc[st.top()]=tot;
val[tot]+=a[st.top()];
st.pop();
}
}
void toposort(){
for(int i=1;i<=n;i++){
if(!d[i]){
q.push(i);
dist[i]=a[i];
}
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i<G[x].size();i++){
dist[G[x][i]]=max(dist[G[x][i]],dist[x]+a[dist[G[x][i]]]);
d[G[x][i]]--;
if(!d[G[x][i]])
q.push(G[x][i]);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++){
cin>>u>>v;
G[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])
tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j=0;j<G[i].size();j++){
int x=scc[i],y=scc[G[i][j]];
if(x!=y){
H[x].push_back(y);
d[y]++;
}
}
}
toposort();
for(int i=1;i<=n;i++)
ans=max(ans,dist[i]);
cout<<ans<<endl;
return 0;
}