#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
const int dir_4[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
const int dir_8[8][2] = {{1, 0},  {1, 1},   {0, 1},  {-1, 1},
                         {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
struct node {
  int s;
  int t;
  int l;
  int r;
  bool ch;
  node* chl;
  node* chr;
};
node* init() {
  node* ret = new node;
  ret->s = 0;
  ret->t = 0;
  ret->l = 0;
  ret->r = 1 << 21;
  ret->ch = false;
  return ret;
}
void mkch(node* T) {
  T->chl = new node;
  T->chl->s = 0;
  T->chl->t = 0;
  T->chl->l = T->l;
  T->chl->r = (T->l + T->r) / 2;
  T->chl->ch = false;
  T->chr = new node;
  T->chr->s = 0;
  T->chr->t = 0;
  T->chr->l = (T->l + T->r) / 2;
  T->chr->r = T->r;
  T->chr->ch = false;
  T->ch = true;
}
void updata(int a, int b, int x, node* T) {
  if (b <= T->l || T->r <= a) return;
  if (a <= T->l && T->r <= b) {
    T->s += x;
    T->t += x;
    return;
  }
  if (!T->ch) mkch(T);
  updata(a, b, x, T->chl);
  updata(a, b, x, T->chr);
  T->s = min(T->chl->s, T->chr->s) + T->t;
}
int query(int x, node* T) {
  if (T->s >= x) return -1;
  if (!T->ch) return T->r - 1;
  int vr = query(x - T->t, T->chr);
  if (vr != -1) return vr;
  return query(x - T->t, T->chl);
}
vector<int> G[500010];
int h[500010];
int c[500010], d[500010];
void dfs(int v, int p, int C, int D) {
  if (D >= h[v]) {
    D = h[v];
    if (h[C] >= D) {
      D = h[C];
      C = v;
    }
  }
  c[v] = C;
  d[v] = D;
  for (int i = 0; i < G[v].size(); i++) {
    if (G[v][i] == p) continue;
    dfs(G[v][i], v, C, D);
  }
}
int main() {
  static int n;
  static int k;
  static int s[500010];
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &h[i]);
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    G[a].push_back(b);
    G[b].push_back(a);
  }
  scanf("%d", &k);
  for (int i = 0; i < k; i++) scanf("%d", &s[i]);
  vector<int> Z;
  for (int i = 1; i <= n; i++) Z.push_back(h[i]);
  for (int i = 0; i < k; i++) Z.push_back(s[i]);
  sort(Z.begin(), Z.end());
  Z.erase(unique(Z.begin(), Z.end()), Z.end());
  for (int i = 1; i <= n; i++)
    h[i] = lower_bound(Z.begin(), Z.end(), h[i]) - Z.begin();
  for (int i = 0; i < k; i++)
    s[i] = lower_bound(Z.begin(), Z.end(), s[i]) - Z.begin();
  h[0] = INF + 10;
  dfs(1, 0, 0, INF + 10);
  static vector<int> vec[500010];
  for (int i = 1; i <= n; i++) {
    vec[c[i]].push_back(d[i]);
  }
  node* T = init();
  for (int i = 0; i < k; i++) updata(0, s[i] + 1, -1, T);
  for (int i = 1; i <= n; i++) {
    updata(0, h[i] + 1, vec[i].size(), T);
  }
  if (T->s >= 0) {
    puts("0");
    return 0;
  }
  int ret = INF + 10;
  for (int i = 1; i <= n; i++) {
    updata(0, h[i] + 1, -vec[i].size(), T);
    int memo = query(0, T);
    for (int j = 0; j < vec[i].size(); j++) {
      updata(0, vec[i][j] + 1, 1, T);
    }
    if (T->s >= 0) ret = min(ret, Z[memo] - Z[h[i]]);
    for (int j = 0; j < vec[i].size(); j++) {
      updata(0, vec[i][j] + 1, -1, T);
    }
    updata(0, h[i] + 1, vec[i].size(), T);
  }
  if (ret == INF + 10)
    puts("-1");
  else
    cout << ret << endl;
}
