#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include<queue>
using namespace std;
typedef long long ll;
const int manx=1e6+10;
const int mamx = 1e6 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
inline int read() {
char c = getchar(); int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
queue<int> q;
struct node{
int u,v,nxt,w;
}e[manx<<1];
int sum[manx],top,st[manx],head[manx],cnt,n,m,low[manx],lt[manx],re,dfn[manx],js;
int add(int u,int v){
e[++cnt].nxt = head[u];
e[cnt].u = u;
e[cnt].v = v;
head[u] = cnt;
}
struct tap{
int u,v,x;
}len[manx<<1];
int rd[manx],cd[manx],a[manx],null,f[manx];
void tarjan(int u){
dfn[u] = low[u] = ++js;
st[++top] = u;
for(int i = head[u];i;i = e[i].nxt )
{
int v = e[i].v ;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u],low[v]);
}else
{
if(!lt[v]){
low[u] = min(dfn[v],low[u]);
}
}
}
if(dfn[u] == low[u]){
lt[u] = ++re;
sum[re] = len[u].x;
while(st[top] != u)
{
sum[re] += len[st[top]].x;
lt[st[top]] = re;
top--;
}
top --;
}
}
node ee[manx<<1];
int headd[manx],ans,zxs,cntt;
int addd(int u ,int v){
ee[++cntt].u = u;
ee[cntt].nxt = headd[u];
ee[cntt].v = v;
headd[u] = cntt;
}
int tuopu(){
for(int i = 1;i <= re ;i ++){
if(rd[i]==0)
{
q.push(i);
a[i] = sum[i];
}
}
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = headd[u];i;i = ee[i].nxt){
int v = ee[i].v ;
a[v] = max(a[v],a[u]+sum[v]);
rd[v]--;
if(rd[v]==0)
q.push(v);
}
}
int jj = 0;
for(int i = 1;i <= re; i++){
jj = max(jj,a[i]);
return jj;
}
}
int main(){
n = read();
m = read();
for(int i = 1;i <= n ;i ++)
{
len[i].x = read();
}
for(int i = 1;i <= m; i++){
int x = read(),y = read();
add(x,y);
}
for(int i = 1;i <= n ;i ++){
if(!dfn[i])
tarjan(i);
}
for(int i = 1;i <= n;i++)
for(int j = head[i];j;j = e[j].nxt ){
int v = e[j].v;
if(lt[i] != lt[v])
{
addd(lt[i],lt[v]);
}
}
for(int i = 1;i <= re; i++)
for(int j = headd[i];j;j = ee[j].nxt )
{
int v = ee[j].v ;
cd[i]++;
rd[v]++;
}
cout<<tuopu();
return 0;
}