#include<bits/stdc++.h>
using namespace std;
const int maxn=10015;
int n,m,sum,tim,top,s;
int p[maxn],hd[maxn],sd[maxn],dfn[maxn],low[maxn];
int sta[maxn],h[maxn],vis[maxn],in[maxn],dis[maxn];;
struct Edge{
int from;int to;int nxt;
}edge[100150],ed[100150];
void add(int x,int y){
edge[++sum].nxt=hd[x];
edge[sum].from=x;
edge[sum].to=y;
hd[x]=sum;
}
void tarjan(int x){
dfn[x]=low[x]=++tim;
sta[++top]=x;vis[x]=1;
for(int i=hd[x];i;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[x]=min(low[x],low[v]);
}else{
if(vis[v]){
low[x]=min(low[x],dfn[v]);
}
}
if(low[x]==dfn[x]){
int y;
while(y=sta[top--]){
sd[y]=x;
vis[y]=0;
if(x==y){
break;
}
p[x]+=p[y];
}
}
}
}
int tuopu(){
queue<int> q;
int tot =0;
for(int i=1;i<=n;i++){
if(sd[i]==i&&!in[i]){
q.push(i);
dis[i]=p[i];
}
}
while(q.size()){
int k=q.front();q.pop();
for(int i=h[k];i;i=ed[i].nxt){
int v=ed[i].to;
dis[v]=max(dis[v],p[v]+dis[k]);
in[v]--;
if(in[v]==0){
q.push(v);
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dis[i]);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
}
for(int i=1;i<=m;i++){
int xx,yy;
scanf("%d%d",&xx,&yy);
add(xx,yy);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=1;i<=m;i++){
int x=sd[edge[i].from],y=sd[edge[i].to];
if(x!=y){
ed[++s].nxt=h[x];
ed[s].to=y;
ed[s].from=x;
h[x]=s;
in[y]++;
}
printf("%d",tuopu());
return 0;
}
}