#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200000;
const long long INF = LLONG_MAX / 2LL;
vector<int> G[MAX_N];
int A[MAX_N];
long long T[MAX_N], DP[MAX_N], DP2[MAX_N];
void initGraph(int n) {
  for (int i = 0; i < n; i++) G[i].clear();
}
void add(int u, int v) {
  G[u].push_back(v);
  G[v].push_back(u);
}
void dfs(int u, int p = -1) {
  T[u] = A[u];
  DP[u] = -INF;
  DP2[u] = -INF;
  vector<long long> vec;
  for (auto v : G[u]) {
    if (v == p) continue;
    dfs(v, u);
    T[u] += T[v];
    DP[u] = max(DP[u], DP[v]);
    vec.push_back(DP[v]);
  }
  DP[u] = max(DP[u], T[u]);
  if (((int)(vec).size()) >= 2) {
    for (int i = 0; i < 2; ++i)
      for (int j = i + 1; j < ((int)(vec).size()); ++j)
        if (vec[i] < vec[j]) swap(vec[i], vec[j]);
    DP2[u] = vec[0] + vec[1];
  }
}
int main() {
  int n;
  while (scanf("%d", &n) == 1) {
    initGraph(n);
    for (int i = 0; i < n; i++) scanf("%d", &A[i]);
    for (int i = 0; i < n - 1; i++) {
      int u, v;
      scanf("%d%d", &u, &v);
      u--, v--;
      add(u, v);
    }
    dfs(0);
    long long ans = *max_element(DP2, DP2 + n);
    if (ans == -INF)
      puts("Impossible");
    else
      printf("%I64d\n", ans);
  }
}
