#include <bits/stdc++.h>
using namespace std;
vector<int> v[300005];
int n, t[300005 << 2];
void Build(int k, int l, int r) {
  if (l == r) {
    scanf("%d", t + k);
    return;
  }
  int mid = (l + r) >> 1;
  Build(k << 1, l, mid);
  Build(k << 1 | 1, mid + 1, r);
  t[k] = max(t[k << 1], t[k << 1 | 1]);
}
void Update(int k, int l, int r, int d, int h) {
  if (l == r) {
    t[k] += d;
    return;
  }
  int mid = (l + r) >> 1;
  if (h <= mid)
    Update(k << 1, l, mid, d, h);
  else
    Update(k << 1 | 1, mid + 1, r, d, h);
  t[k] = max(t[k << 1], t[k << 1 | 1]);
}
int main() {
  int a, b;
  scanf("%d", &n);
  Build(1, 1, n);
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &a, &b);
    v[a].push_back(b);
    v[b].push_back(a);
  }
  int mins = 1e9 + 10;
  for (int i = 1; i <= n; i++) {
    Update(1, 1, n, -2, i);
    for (int j = 0; j < v[i].size(); j++) {
      int h = v[i][j];
      Update(1, 1, n, -1, h);
    }
    mins = min(mins, t[1]);
    Update(1, 1, n, 2, i);
    for (int j = 0; j < v[i].size(); j++) {
      int h = v[i][j];
      Update(1, 1, n, 1, h);
    }
  }
  printf("%d\n", mins + 2);
  return 0;
}
