#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10050;
int a[maxn],dfn[maxn],low[maxn],instack[maxn],ord=0,color[maxn],color_cnt=0,rudu[maxn],dis[maxn],n,m,ans=0;
vector<int> G[maxn],G2[maxn];
stack<int> stk;
void tarjan(int u){
dfn[u]=low[u]=++ord;
stk.push(u);
instack[u]=1;
for(int v:G[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
color_cnt++;
while(stk.top()!=u){
color[stk.top()]=color_cnt;
instack[stk.top()]=0;
a[u]+=a[stk.top()];
stk.pop();
}
color[stk.top()]=color_cnt;
instack[u]=0;
stk.pop();
}
}
void tp(){//拓扑
queue<int>q;
for(int i=1;i<=n;i++){
if(color[i]==i&&!rudu[i]){
q.push(i);
dis[i]=a[i];
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i:G2[u]){
dis[i]=max(dis[i],dis[u]+a[i]);
if(--rudu[i]==0)q.push(i);
}
}
for(int i=1;i<=n;i++){
ans=max(ans,dis[i]);
}
}
int 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;
G[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int u=1;u<=n;u++){
if(color[u]!=u)continue;
for(int v:G[u]){
if(color[u]!=color[v]&&color[v]==v){
G2[color[u]].push_back(color[v]);
rudu[color[v]]++;
}
}
}
tp();
cout<<ans;
return 0;
}