package Week2;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
//6 5
//1
//2
//2
//3
//3
//4
//1 2
//1 3
//2 4
//3 4
//5 6
//题意: 给出一个有向无环图,每个顶点都有一个权值。
//求一条从入度为0的顶点到出度为0的顶点的一条路径,
//路径上所有顶点权值和最大。
public class F_Topological {
static int inDegree[];
static int outDegree[];
static int N,M;
static long maxCost = Integer.MIN_VALUE;
static int dis[];//每个顶点的权值
static int dp[];
static List<NodeF> adjList[] = null;
public static void main(String[] args) throws Exception{
System.setIn(new FileInputStream("Solution.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(br.ready()) {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
adjList = new ArrayList[N+1];
inDegree = new int[N+1];
outDegree = new int[N+1];
dis = new int[N+1];
dp = new int[N+1];
Arrays.fill(dp, Integer.MIN_VALUE);
Queue<NodeF> pq = new LinkedList<NodeF>();
maxCost = Integer.MIN_VALUE;
pq.clear();
for (int i = 1; i <= N; i++) {
adjList[i]=new ArrayList<NodeF>();
}
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
dis[i]=Integer.parseInt(st.nextToken());
}
for (int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int cost = dis[e];
adjList[s].add(new NodeF(e,cost));
outDegree[s]++;
inDegree[e]++;
}
for (int i = 1; i <= N; i++) {
if(inDegree[i]==0) {
pq.add(new NodeF(i,dis[i]));
dp[i]=dis[i];
}
}
while(!pq.isEmpty()) {
NodeF node = pq.poll();
for (int j = 0; j < adjList[node.e].size(); j++) {
NodeF next = adjList[node.e].get(j);
if(inDegree[next.e] == 0) {
continue;
}
if(dp[node.e] + next.cost > dp[next.e]) {
dp[next.e] = dp[node.e]+next.cost;
}
if(--inDegree[next.e] == 0) {
pq.add(next);
}
}
}
for (int i = 1; i <= N; i++) {
if(outDegree[i] == 0) {
maxCost = Math.max(maxCost, dp[i]);
}
}
System.out.println(maxCost);
}
}
}
class NodeF{
int e,cost;
public NodeF(int e,int cost) {
this.e=e;
this.cost=cost;
}
}