#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
int n;
long long a[maxn];
vector<int> G[maxn];
multiset<long long> st;
int main() {
  int u, v;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    st.insert(a[i]);
  }
  for (int i = 0; i < n - 1; i++) {
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  long long ans = 1e10;
  for (int i = 1; i <= n; i++) {
    long long res = a[i];
    st.erase(st.find(a[i]));
    for (int j = 0; j < G[i].size(); j++) {
      int v = G[i][j];
      res = max(res, a[v] + 1);
      st.erase(st.find(a[v]));
    }
    if (!st.empty()) res = max(res, *st.rbegin() + 2);
    st.insert(a[i]);
    for (int j = 0; j < G[i].size(); j++) {
      st.insert(a[G[i][j]]);
    }
    ans = min(ans, res);
  }
  cout << ans << endl;
}
