#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]);
}
}
#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]);
}
}