#include<bits/stdc++.h>
using namespace std;
namespace _wrk{;
#define int long long
vector<int>g[11234];
vector<int>g2[11234];
vector<int>g22[11234];
int a[11234];
bool insta[11234];
int dfsid[11234],laid=1;;
int vl[11234];
bool vis[11234];
int d[11234];
struct bc{
int aa[11234];
void init(int n){
for(int i=1;i<=n;i++)aa[i]=i;
}
int fin(int a){
return aa[a]==a?a:(aa[a]=fin(aa[a]));
}
void me(int a,int b){
if(a!=b)aa[fin(a)]=fin(b);
}
}bcj;
int w[11234];
void dfs(int now){
dfsid[now]=laid++;
vis[now]=insta[now]=1;
vl[now]=now;
for(auto x:g[now]){
if(!vis[x])dfs(x);
}
for(auto x:g[now]){
if(insta[vl[x]]&&dfsid[vl[x]]<dfsid[vl[now]]){
vl[now]=vl[x];
}
}
insta[now]=0;
}
int main(){
int n,m;
cin>>n>>m;
bcj.init(n);
for(int i=1;i<=n;i++)cin>>a[i];
while(m--){
int a,b;
cin>>a>>b;
g[a].push_back(b);
}
for(int i=1;i<=n;i++){
if(!vis[i])dfs(i);
}
for(int i=1;i<=n;i++){
if(bcj.fin(vl[i])!=bcj.fin(i)){
a[bcj.fin(vl[i])]+=a[bcj.fin(i)];
a[bcj.fin(i)]=0;
bcj.me(i,vl[i]);
}
}
for(int i=1;i<=n;i++){
for(auto x:g[i]){
if(bcj.fin(x)!=bcj.fin(i)){
g2[bcj.fin(i)].push_back(bcj.fin(x));
g22[bcj.fin(x)].push_back(bcj.fin(i));
w[bcj.fin(x)]++;
}
}
}
int ans=0;
queue<int>l;
for(int i=1;i<=n;i++){
if(bcj.fin(i)==i&&w[i]==0){
l.push(i);
d[i]=a[i];
}
}
while(l.size()){
auto x=l.front();l.pop();
for(auto xx:g22[x]){
d[x]=max(d[x],d[xx]+a[x]);
}
for(auto xx:g2[x]){
w[xx]--;
if(w[xx]==0)l.push(xx);
}
}
for(int i=1;i<=n;i++){
ans=max(ans,d[i]);
}
cout<<ans;
return 0;
}
}
signed main(){
return _wrk::main();
}
WA on Test #7。