1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4
5 using namespace std;
6
7 int val[100100];
8 int head[100100];
9 int dp[100100];
10 int num;
11 bool in[100010];
12 bool en[100010];
13
14 struct edge
15 {
16 int fro,to,next;
17 }e[10000100];
18
19 void addEdge(int _fro,int _to)
20 {
21 num++;
22 e[num].fro=_fro;
23 e[num].to=_to;
24 e[num].next=head[_fro];
25 head[_fro]=num;
26 }
27
28 int dfs(int x)
29 {
30 if(dp[x]!=0)
31 return dp[x];
32 dp[x]=-(1<<29);
33 for(int i=head[x];i!=-1;i=e[i].next)
34 {
35 int v=e[i].to;
36 dfs(v);
37 dp[x]=max(dp[x],dp[v]+val[x]);
38 }
39 return dp[x];
40 }
41
42 int main()
43 {
44 int n,m;
45 while(scanf("%d%d",&n,&m)!=EOF)
46 {
47 num=0;
48 memset(head,-1,sizeof(head));
49 for(int i=0;i<=n;i++)
50 {
51 in[i]=true;
52 en[i]=true;
53 }
54 for(int i=1;i<=n;i++)
55 scanf("%d",&val[i]);
56 int a,b;
57 for(int i=1;i<=m;i++)
58 {
59 scanf("%d%d",&a,&b);
60 en[b]=false;
61 in[a]=false;
62 addEdge(b,a);
63 }
64 int ans=-(1<<29);
65 memset(dp,0,sizeof(dp));
66 for(int i=1;i<=n;i++)
67 {
68 if(en[i])
69 dp[i]=val[i];
70 }
71 for(int i=1;i<=n;i++)
72 {
73 if(in[i])
74 {
75 ans=max(ans,dfs(i));
76 }
77 }
78 cout<<ans<<endl;
79 }
80 return 0;
81 }