#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n, m;
int vis[N], low[N], dfn[N], scc[N], val[N], p[N], in[N];
vector<int> E[N], e[N];
stack<int> st;
queue<int> q;
int tt = 0, cnt = 0;
void tarjan(int x) {
vis[x] = 1;
st.push(x);
low[x] = dfn[x] = ++tt;
for(int i = 0; i < E[x].size(); i++) {
int v = E[x][i];
if(!dfn[v]) {
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis[v]) {
low[x] = min(low[x], low[v]);
}
}
if(low[x] == dfn[x]) {
++cnt;
while(1) {
int t = st.top();
st.pop();
scc[t] = cnt;
val[cnt] += p[t];
vis[t] = 0;
if(t == x) break;
}
}
}
int dis[N];
void toposort() {
for(int i = 1; i <= cnt; i++) {
if(!in[i] && scc[i]) q.push(i);
dis[i] = val[i];
}
while(!q.empty()) {
int t = q.front();
q.pop();
for(int i = 0; i < e[t].size(); i++) {
int v = e[t][i];
if(dis[v] < dis[t] + p[v]) {
dis[v] = dis[t] + p[v];
}
in[v]--;
if(in[v] == 0) q.push(v);
}
}
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> p[i];
}
for(int i = 1; i <= n; i++) {
int u, v;
cin >> u >> v;
E[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 < E[i].size(); i++) {
int u = i, v = E[i][j];
if(scc[u] != scc[v]) {
e[scc[u]].push_back(scc[v]);
in[v]++;
}
}
}
toposort();
int ans = 0;
for(int i = 1; i <= n; i++) {
ans = max(ans, dis[i]);
}
cout << ans << endl;
return 0;
}