#include <iostream>
#include <vector>
using namespace std;
const int maxn = 100000;
vector<int> adj[maxn];
int n, m, sccnum;
struct Node
{
int to, from, v;
} e[maxn];
bool visited[maxn];
int maxWeightSum = 0;
void DFS(int u, int weightSum)
{
visited[u] = true;
weightSum += e[u].v;
maxWeightSum = max(maxWeightSum, weightSum);
for (int i = 0; i < adj[u].size(); i++)
{
int idx = adj[u][i];
int v = e[idx].to;
if (!visited[v]) {
DFS(v, weightSum);
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> e[i].v;
}
for (int i = 1; i <= m; i++)
{
cin >> e[i].from >> e[i].to;
adj[e[i].from].push_back(i);
}
for (int i = 1; i <= n; i++)
{
if (!visited[i])
{
DFS(i, 0);
}
}
cout << maxWeightSum << endl;
return 0;
}