#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int n, m, h[N], b[N], q[N];
vector<int> e[N];
pair<int, int> a[N];
bool cmp(pair<int, int> x, pair<int, int> y) {
  if (h[x.first] != h[y.first]) return h[x.first] > h[y.first];
  if (x.first != y.first) return x.first < y.first;
  return h[x.second] > h[y.second];
}
void dfs(int x, int fa, int v1, int v2) {
  if (h[x] < h[v1])
    v2 = v1, v1 = x;
  else if (h[x] < h[v2])
    v2 = x;
  a[x] = pair<int, int>(v1, v2);
  for (auto i : e[x])
    if (i != fa) dfs(i, x, v1, v2);
}
void work(int l, int r, int k) {
  int ans = 0;
  for (int i = (int)(1); i <= (int)(r - l + 1); i++) {
    int t = 0;
    if (i <= *q)
      t = q[i];
    else if (k + i - *q - 1 <= m)
      t = b[k + i - *q - 1];
    ans = max(ans, t - h[a[l + i - 1].first]);
    if (t > h[a[l + i - 1].second]) return;
  }
  printf("%d\n", ans);
  exit(0);
}
int main() {
  scanf("%d", &n);
  for (int i = (int)(1); i <= (int)(n); i++) scanf("%d", &h[i]);
  for (int i = (int)(2); i <= (int)(n); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[x].push_back(y);
    e[y].push_back(x);
  }
  h[0] = 1 << 30;
  dfs(1, 0, 0, 0);
  scanf("%d", &m);
  for (int i = (int)(1); i <= (int)(m); i++) scanf("%d", &b[i]);
  sort(a + 1, a + n + 1, cmp);
  sort(b + 1, b + m + 1, greater<int>());
  int le = 0;
  for (int i = (int)(1); i <= (int)(m); i++)
    if (b[i] > h[a[i].first]) le = i;
  for (int i = 1, j = 1, k = 1; i <= n; i = j + 1) {
    for (j = i; j < n && a[j + 1].first == a[i].first; ++j)
      ;
    if (*q <= j - i + 1 && j >= le) work(i, j, k);
    for (int t = (int)(i); t <= (int)(j); t++) {
      for (; k <= m && b[k] > h[a[t].first]; ++k) q[++*q] = b[k];
      ++k;
    }
  }
  puts("-1");
}
