#include <bits/stdc++.h>
using namespace ::std;
const int maxn = 5e5 + 500;
const int mod = 1e9 + 7;
const int inf = 1e9 + 500;
int y;
int b[maxn];
int h[maxn];
vector<int> unik;
int min2[maxn];
int min1[maxn];
int kimin[maxn];
vector<int> vec[maxn];
int k;
vector<int> ger[maxn];
int idmin[maxn];
inline int id(int x) {
  return upper_bound(unik.begin(), unik.end(), x) - (unik.begin()) - 1;
}
void dfs(int a, int p = 0) {
  min1[a] = min1[p];
  min2[a] = min2[p];
  kimin[a] = kimin[p];
  if (h[a] < min1[a]) {
    min2[a] = min1[a];
    min1[a] = h[a];
    kimin[a] = a;
  } else if (h[a] < min2[a]) {
    min2[a] = h[a];
  }
  for (auto v : ger[a]) {
    if (v != p) {
      dfs(v, a);
    }
  }
}
int seg[maxn * 4];
int lazy[maxn * 4];
inline void shift(int node) {
  lazy[2 * node] += lazy[node];
  lazy[2 * node + 1] += lazy[node];
  seg[2 * node] += lazy[node];
  seg[2 * node + 1] += lazy[node];
  lazy[node] = 0;
}
int ro, vo;
void update(int L, int R, int node) {
  if (R <= ro) {
    seg[node] += vo;
    lazy[node] += vo;
    return;
  }
  if (ro <= L) {
    return;
  }
  int mid = (L + R) / 2;
  shift(node);
  update(L, mid, 2 * node);
  if (mid < ro) {
    update(mid, R, 2 * node + 1);
  }
  seg[node] = min(seg[2 * node], seg[2 * node + 1]);
}
bool good(int p, int v) {
  for (auto u : vec[p]) {
    ro = idmin[u];
    vo = -1;
    update(0, y, 1);
    ro = id(min(v, min2[u])) + 1;
    vo = +1;
    update(0, y, 1);
  }
  bool ans = 1;
  if (seg[1] < 0) {
    ans = 0;
  }
  for (auto u : vec[p]) {
    ro = idmin[u];
    vo = +1;
    update(0, y, 1);
    ro = id(min(v, min2[u])) + 1;
    vo = -1;
    update(0, y, 1);
  }
  return ans;
}
int main() {
  int n;
  scanf("%i", &n);
  for (int i = 0; i < n; i++) {
    scanf("%i", &h[i]);
  }
  for (int i = 1; i < n; i++) {
    int v, u;
    scanf("%i%i", &v, &u);
    v--;
    u--;
    ger[u].push_back(v);
    ger[v].push_back(u);
  }
  min1[0] = inf;
  min2[0] = inf;
  kimin[0] = -1;
  dfs(0);
  for (int i = 0; i < n; i++) {
    vec[kimin[i]].push_back(i);
  }
  scanf("%i", &k);
  unik.push_back(-inf);
  for (int i = 0; i < k; i++) {
    scanf("%i", &b[i]);
    unik.push_back(b[i]);
  }
  sort(unik.begin(), unik.end());
  auto it = unique(unik.begin(), unik.end());
  unik.resize(distance(unik.begin(), it));
  y = unik.size();
  for (int i = 0; i < k; i++) {
    ro = id(b[i]) + 1;
    vo = -1;
    update(0, y, 1);
  }
  for (int i = 0; i < n; i++) {
    idmin[i] = id(min1[i]) + 1;
  }
  for (int i = 0; i < n; i++) {
    ro = idmin[i];
    vo = 1;
    update(0, y, 1);
  }
  int ans = inf;
  for (int i = 0; i < n; i++) {
    if (good(i, inf)) {
      int s = h[i] - 1;
      int e = inf;
      while (e - s > 1 && s + 1 - h[i] < ans) {
        int mid = (e + s) / 2;
        if (good(i, mid)) {
          e = mid;
        } else {
          s = mid;
        }
      }
      ans = min(ans, e - h[i]);
    }
  }
  if (ans == inf) {
    printf("-1");
  } else {
    printf("%i", ans);
  }
}
