#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> g[200000];
long long int a[200000];
long long int m = LLONG_MIN;
long long int sz[200000];
long long int mx[200000];
void dfs(int cur, int pr) {
  sz[cur] = a[cur];
  mx[cur] = LLONG_MIN;
  vector<long long int> q;
  for (int i = 0; i < g[cur].size(); i++)
    if (g[cur][i] != pr) {
      dfs(g[cur][i], cur);
      sz[cur] += sz[g[cur][i]];
      mx[cur] = mx[cur] > mx[g[cur][i]] ? mx[cur] : mx[g[cur][i]];
      q.push_back(mx[g[cur][i]]);
    }
  mx[cur] = mx[cur] > sz[cur] ? mx[cur] : sz[cur];
  if (q.size() < 2) return;
  sort(q.begin(), q.end(), greater<long long int>());
  if (q[0] + q[1] > m) m = q[0] + q[1];
}
int main() {
  int u, v;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%lld", &a[i]);
  for (int i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    g[--u].push_back(--v);
    g[v].push_back(u);
  }
  dfs(0, -1);
  if (m == LLONG_MIN)
    printf("Impossible\n");
  else
    printf("%lld\n", m);
  return 0;
}
