#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=10010;
vector<int>g[N];
stack<int>st;
vector<int>nd[N];
vector<int>ng[N];
vector<int>np[N];
set<int>t;
queue<int>q;
int low[N],dfn[N],tot,n,m,u,v,ind,k,c[N],s,w[N],nw[N],dp[N],id[N],ma;
bool vis[N],f[N];
void tarjan(int x){
low[x]=dfn[x]=++ind;
st.push(x);
vis[x]=1;
for(int i=0;i<g[x].size();i++){
int tmp=g[x][i];
if(!dfn[tmp]){
tarjan(tmp);
low[x]=min(low[x],low[tmp]);
}else if(vis[tmp]){
low[x]=min(low[x],dfn[tmp]);
}
}
if(low[x]==dfn[x]){
tot++;
int u;
do{
u=st.top();
st.pop();
vis[u]=0;
c[u]=tot;
k++;
}while(x!=u);
if(k>1) s++;
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i];
}
for(int i=0;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++){
nd[c[i]].push_back(i);
}
for(int i=1;i<=tot;i++){
for(int j=0;j<nd[i].size();j++){
nw[i]+=w[nd[i][j]];
}
}
for(int i=1;i<=n;i++){
t.clear();
for(int j=0;j<g[i].size();j++){
if(c[g[i][j]]!=c[i]){
t.insert(c[g[i][j]]);
}
}
for(auto j=t.begin();j!=t.end();j++){
ng[*j].push_back(c[i]);
np[c[i]].push_back(*j);
id[*j]++;
}
}
for(int i=1;i<=tot;i++){
if(!id[i]){
q.push(i);
dp[i]=nw[i];
}
}
while(!q.empty()){
int i=q.front();
q.pop();
for(int j=0;j<np[i].size();j++){
if(!(--id[np[i][j]])) q.push(np[i][j]);
}
for(int j=0;j<ng[i].size();j++){
dp[i]=max(dp[j],dp[ng[i][j]]+nw[i]);
}
}
for(int i=1;i<=tot;i++){
ma=max(ma,dp[i]);
}
cout<<ma;
return 0;
}