#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
struct my{
int v,next;
};
my bian[200000+10];
my bian2[200000+10];
bool visit[20000+10];
int adj2[20000+10];
int w[20000+10];
int adj[20000+10];
int sccno[20000+10];
int pre[20000+10];
int lowlink[20000+10];
int ans[20000+10];
stack<int>s;
int dfsnum;
int n,m;
int fa;
int fa2;
void myinsert(int u,int v){
bian[++fa].v=v;
bian[fa].next=adj[u];
adj[u]=fa;
}
void myinsert2(int u,int v){
bian2[++fa2].v=v;
bian2[fa2].next=adj2[u];
adj2[u]=fa2;
}
void tarjan(int u){
pre[u]=lowlink[u]=++dfsnum;
s.push(u);
for (int i=adj[u];i!=-1;i=bian[i].next){
int v=bian[i].v;
if(!pre[v]){
tarjan(v);
lowlink[u]=min(lowlink[v],lowlink[u]);
}
else if(!sccno[v]){
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(pre[u]==lowlink[u]){
for(;;){
int e=s.top();
s.pop();
sccno[e]=u;
if(e==u) break;
}
}
}
void suodian(){
for (int i=1;i<=n;i++){
for (int j=adj[i];j!=-1;j=bian[j].next){
int u=bian[j].v;
if(sccno[i]==u) continue;
if(w[u]==0)
continue;
if(sccno[u]!=u){
w[sccno[u]]+=w[u];
w[u]=0;
}
else myinsert2(sccno[i],u);
}
}
}
void dfs(int x,int last)
{
int v;
ans[x]=max(ans[x],ans[last]+w[x]);
for(int i=adj2[x];i!=-1;i=bian2[i].next){
v=bian2[i].v;
if(w[v]!=0&&visit[v]==false){
visit[v]=true;
dfs(v,x);
visit[v]=false;
}
}
}
int main(){
memset(adj,-1,sizeof(adj));
memset(bian,-1,sizeof(bian));
memset(adj2,-1,sizeof(adj2));
memset(bian2,-1,sizeof(bian2));
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
int u,v;