rt
#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int MAXN = 1e4 + 24,MAXM = 1e5 + 24;
int n,m,u,v;
struct graph
{
struct edge
{
int u,v,next;
}e[MAXM << 1];
int head[MAXN],cnt;
void add(int u,int v)
{
e[++cnt].u = u;
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
}
}o,g;
int a[MAXN],val[MAXN];
int dfn[MAXN],low[MAXN],timer,scc[MAXN],num;
stack<int> st;
bool vis[MAXN];
void tarjan(int u)
{
dfn[u] = low[u] = ++timer;
st.push(u);
vis[u] = 1;
for(int i = o.head[u];i;i = o.e[i].next)
{
int v = o.e[i].v;
if(!dfn[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
}
else
low[u] = min(low[u],dfn[v]);
}
if(low[u] == dfn[u])
{
int v = -1;
++num;
while(v != u)
{
v = st.top();
st.pop();
scc[v] = num;
val[num] += a[v];
vis[v] = 0;
}
}
}
int in[MAXN],dp[MAXN];
queue<int> q;
int topo()
{
for(int i = 1;i <= num;i++)
{
if(!in[i])
{
q.push(i);
dp[i] = val[i];
}
}
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = g.head[u];i;i = g.e[i].next)
{
int v = g.e[i].v;
dp[v] = max(dp[v],dp[u] + val[v]);
--in[v];
if(!in[v])
q.push(v);
}
}
int ans = -1;
for(int i = 1;i <= n;i++)
ans = max(ans,dp[i]);
return ans;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i++)
cin >> a[i];
for(int i = 1;i <= n;i++)
{
cin >> u >> v;
o.add(u,v);
}
for(int i = 1;i <= n;i++)
{
if(!dfn[i])
tarjan(i);
}
for(int i = 1;i <= m;i++)
{
int u = o.e[i].u,v = o.e[i].v;
if(scc[u] != scc[v])
{
g.add(scc[u],scc[v]);
++in[scc[v]];
}
}
cout << topo();
}