RT
#include<bits/stdc++.h>
using namespace std;
int n,m,sum[10005],u,v,dfn[10005],cnt,low[10005],total,color[10005],dis[10005];
int in[10005],tp[10005],ans,f[10005],_cnt;
bool vis[10005];
vector<int>ve[10005],from[10005],to[10005];
stack<int>s;
void tarjan(int now) {
dfn[now]=low[now]=++cnt;
s.push(now);
vis[now]=true;
for(int i=0; i<ve[now].size(); i++) {
if(!dfn[ve[now][i]]) {
tarjan(ve[now][i]);
low[now]=min(low[now],low[ve[now][i]]);
} else if(vis[ve[now][i]])
low[now]=min(low[now],dfn[ve[now][i]]);
}
if(low[now]==dfn[now]) {
total++;
while(1) {
int temp=s.top();
color[s.top()]=total;
dis[total]+=sum[s.top()];
vis[s.top()]=false;
s.pop();
if(now==temp)break;
}
}
return;
}
void bfs() {
queue<int>q;
for(int i=1; i<=n; i++)if(!in[i])q.push(i);
while(!q.empty()) {
int y=q.front();
tp[++_cnt]=y;
q.pop();
for(int i=0; i<to[y].size(); i++) {
in[to[y][i]]--;
if(!in[to[y][i]])q.push(to[y][i]);
}
}
return;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)scanf("%d",sum+i);
for(int i=1; i<=m; i++) {
scanf("%d%d",&u,&v);
ve[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<ve[i].size(); i++) {
if(color[i]!=color[ve[i][j]]) {
from[color[ve[i][j]]].push_back(color[i]);
to[color[i]].push_back(color[ve[i][j]]);
in[color[ve[i][j]]]++;
}
}
}
bfs();
for(int i=1; i<=total; i++) {
f[i]=dis[i];
for(int j=0; j<from[i].size(); j++) {
f[i]=max(f[i],dis[i]+f[from[i][j]]);
ans=max(ans,f[i]);
}
}
printf("%d\n",ans);
}