#include <bits/stdc++.h>
#define N 10013
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
int n,m;
int a[N];
struct Edge{
int fr,to,nxt;
}edge[N * 10];
int nbs[N],cnt;
inline void add(int u,int v)
{
edge[++cnt].fr = u;
edge[cnt].to = v;
edge[cnt].nxt = nbs[u];
nbs[u] = cnt;
}
int dfn[N],low[N],t;
bool vis[N];
int stac[N],top;
int sd[N],p[N];
inline void tarjan(int u)
{
dfn[u] = low[u] = ++t;
stac[++top] = u;
vis[u] = 1;
for(int i=nbs[u];i;i=edge[i].nxt)
{
int to = edge[i].to;
if(!dfn[to])
{
tarjan(to);
low[u] = min(low[u],low[to]);
}else{
if(vis[to]) low[u] = min(low[u],dfn[to]);
}
}
if(dfn[u] == low[u])
{
int v;
while(v = stac[top--])
{
sd[v] = u;
vis[v] = 0;
if(u == v) break;
a[u] += a[v];
}
}
}
int head[N],s;
int in[N];
Edge e[N * 10];
inline void connect(int u,int v)
{
e[++s].to = v;
e[s].fr = u;
e[s].nxt = head[v];
head[u] = s;
++in[v];
}
int dis[N];
inline void topo()
{
queue<int>q;
for(int i=1;i<=n;++i)
{
if(sd[i] == i && !in[i])
{
q.push(i);
dis[i] = a[i];
}
}
while(!q.empty())
{
int node = q.front();
q.pop();
for(int i=head[node];i;i=e[i].nxt)
{
int to = e[i].to;
dis[to] = max(dis[to],dis[node] + a[to]);
if(--in[to] == 0) q.push(to);
}
}
int ans = 0;
for(int i=1;i<=n;++i) ans = max(ans,dis[i]);
printf("%d",ans);
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=m;++i)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;++i)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;++i)
{
int u = sd[edge[i].fr],v = sd[edge[i].to];
if(u != v) connect(u,v);
}
topo();
return 0;
}