#include <stdio.h> #include <string.h> #define MAX(X,Y) ((X)>(Y) ? (X) : (Y)) #define INF 1000000000000000 typedef long long LL; int n,sz,first[200010],next[400010],tail[400010],son[200010],bro[200010],vis[200010]; LL a[200010],s[200010],maxs[200010],maxs2[200010]; void addedge(int u,int v); void dfs(int u); int main(void) { //freopen("prize.in","r",stdin); //freopen("prize.out","w",stdout); scanf("%d",&n); int i; for(i=1;i<=n;i++) scanf("%I64d",&a[i]); int u,v; memset(first,0,sizeof(first)); for(sz=0,i=1;i<=n-1;i++) { scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); } memset(vis,0,sizeof(vis)); memset(son,0,sizeof(son)); dfs(1); LL ans=-INF; for(i=1;i<=n;i++) ans=MAX(ans,maxs2[i]); if(ans==-INF) printf("Impossible\n"); else printf("%I64d\n",ans); return 0; } void addedge(int u,int v) { tail[++sz]=v; next[sz]=first[u]; first[u]=sz; } void dfs(int u) { vis[u]=1; s[u]=a[u]; maxs[u]=-INF; int v,e; for(e=first[u];e;e=next[e]) { v=tail[e]; if(vis[v]) continue; bro[v]=son[u]; son[u]=v; dfs(v); s[u]+=s[v]; maxs[u]=MAX(maxs[u],maxs[v]); } maxs[u]=MAX(maxs[u],s[u]); maxs2[u]=-INF; LL t=maxs[son[u]]; for(v=bro[son[u]];v;v=bro[v]) { maxs2[u]=MAX(maxs2[u],t+maxs[v]); t=MAX(t,maxs[v]); } }