#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define makepair make_pair
#define fir first
#define sec second
const int N = 1e4+5, M = 1e5+5;
int n, m;
int head[N], nxt[M], to[M], cccnnnttt;
int a[N];
int dfn[N], low[N], cnt;
int scc[N], sccsum[N], scctot;
bool vis[N];
stack<int> st;
int ax[M], ay[M];
int dp[N];
void add(int u, int v){
to[++cccnnnttt] = v;
nxt[cccnnnttt] = head[u];
head[u] = cccnnnttt;
}
void dfs(int u){
dfn[u] = low[u] = ++cnt;
st.push(u);
vis[u] = 1;
for (int i = head[u];i;i = nxt[i]){
int v = to[i];
if (!dfn[v]){
dfs(v);
low[u] = min(low[u], low[v]);
}
else if (vis[v]){
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u]){
++scctot;
while (st.size()){
int tp = st.top();
st.pop();
scc[tp] = scctot;
sccsum[scctot] += a[tp];
vis[tp] = 0;
}
}
}
void search(int x){
if (dp[x]) return;
dp[x] = sccsum[x];
int mx = 0;
for (int i = head[x];i;i = nxt[i]){
int v = to[i];
if (!dp[v]) search(v);
mx = max(mx, dp[v]);
}
dp[x] += mx;
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= m;i++){
int u, v;
cin >> u >> v;
ax[i] = u;
ay[i] = v;
add(u, v);
}
for (int i = 1;i <= n;i++){
if (!dfn[i]) dfs(i);
}
memset(head, 0, sizeof head);
cccnnnttt = 0;
for (int i = 1;i <= m;i++){
if (scc[ax[i]] != scc[ay[i]]){
add(scc[ax[i]], scc[ay[i]]);
}
}
int ans = 0;
for (int i = 1;i <= scctot;i++){
search(i);
ans = max(ans, dp[i]);
}
cout << ans;
return 0;
}