#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int N = 5e5 + 2;
int seg[N * 4];
int lazy[N * 4];
int hi[N];
int h[N];
int n;
vector<int> g[N];
vector<int> y[N];
pair<int, int> t[N];
void dfs(int v, int p) {
  t[v] = t[p];
  if (hi[t[v].second] > hi[v]) {
    t[v].second = v;
  }
  if (hi[t[v].second] < hi[t[v].first]) swap(t[v].second, t[v].first);
  for (auto &u : g[v]) {
    if (u == p) continue;
    dfs(u, v);
  }
}
void upd(int nod, int l, int r, int L, int R, int val) {
  if (l >= R || L >= r) return;
  if (l >= L && r <= R) {
    seg[nod] += val;
    lazy[nod] += val;
    return;
  }
  int mid = (r + l) >> 1;
  upd(nod << 1, l, mid, L, R, val);
  upd(nod << 1 | 1, mid, r, L, R, val);
  seg[nod] = min(seg[nod << 1], seg[nod << 1 | 1]) + lazy[nod];
}
inline bool check(int v, int val) {
  for (auto &u : y[v]) {
    int x = hi[t[u].first];
    int y = min(hi[t[u].second], hi[t[u].first] + val);
    int z = upper_bound(h + 1, h + n + 1, x) - h;
    int e = upper_bound(h + 1, h + n + 1, y) - h;
    upd(1, 1, N, z, e, +1);
  }
  bool p1 = 0;
  if (seg[1] >= 0) p1 = 1;
  for (auto &u : y[v]) {
    int x = hi[t[u].first];
    int y = min(hi[t[u].second], hi[t[u].first] + val);
    int z = upper_bound(h + 1, h + n + 1, x) - h;
    int e = upper_bound(h + 1, h + n + 1, y) - h;
    upd(1, 1, N, z, e, -1);
  }
  return p1;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &hi[i]);
  }
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  int k;
  scanf("%d", &k);
  for (int i = 1; i <= k; i++) {
    scanf("%d", &h[i]);
  }
  sort(h + 1, h + n + 1);
  for (int i = n; i; i--) {
    upd(1, 1, N, 1, i + 1, -1);
  }
  hi[0] = 1e9 + 100;
  t[0] = {0, 0};
  dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    y[t[i].first].push_back(i);
    int z = upper_bound(h + 1, h + n + 1, hi[t[i].first]) - h;
    upd(1, 1, N, 1, z, +1);
  }
  int l1 = -1, r1 = 1e9 + 2;
  for (int i = 1; i <= n; i++) {
    int l = -1, r = r1;
    if (!(check(i, r - 1))) continue;
    while (r - l > 1) {
      int mid = (r + l) / 2;
      int z = check(i, mid);
      if (z)
        r = mid;
      else
        l = mid;
    }
    r1 = r;
  }
  if (r1 > 1e9) {
    printf("%d", -1);
    return 0;
  }
  printf("%d", r1);
}
