#include <bits/stdc++.h>
using namespace std;
void addmod(int &a, long long b) {
  a = (a + b);
  if (a >= 1000000007) a -= 1000000007;
}
void mulmod(int &a, long long b) { a = (a * b) % 1000000007; }
int getint() {
  int a;
  scanf("%d", &a);
  return a;
}
long long getll() {
  long long a;
  scanf("%I64d", &a);
  return a;
}
class graphal {
 public:
  int n;
  vector<int> val, cnt, best, rbest, bsub, csub;
  vector<vector<int> > ed;
  graphal(const int &n)
      : n(n),
        val(n),
        cnt(n),
        best(n),
        rbest(n),
        bsub(n),
        csub(n),
        ed(n, vector<int>()) {}
  void add(int a, int b) {
    ed[a].push_back(b);
    ed[b].push_back(a);
  }
  void load(int m) {
    for (int i = 0; i < m; i++) {
      add(getint() - 1, getint() - 1);
    }
  }
  void loadvals() {
    for (int i = 0; i < n; i++) {
      val[i] = getint();
    }
  }
  void dfs(int s, int ix = 0, int par = -1) {
    bsub[ix] = csub[ix] = 0;
    cnt[ix] = 1;
    if (val[ix] >= s)
      best[ix] = 1;
    else
      best[ix] = 0;
    for (auto i : ed[ix])
      if (i != par) {
        dfs(s, i, ix);
        cnt[ix] += cnt[i];
        if (best[ix]) {
          if (best[i] == cnt[i])
            best[ix] += best[i];
          else if (best[i] < cnt[i]) {
            if (best[i] > bsub[ix]) {
              csub[ix] = bsub[ix];
              bsub[ix] = best[i];
            } else if (best[i] > csub[ix]) {
              csub[ix] = best[i];
            }
          }
        }
      }
    if (best[ix]) best[ix] += bsub[ix];
    return;
  }
  void dfs2(int ix = 0, int par = -1) {
    if (par == -1)
      rbest[ix] = best[ix];
    else {
      if (best[ix] == 0)
        rbest[ix] = 0;
      else if (rbest[par] == 0)
        rbest[ix] = best[ix];
      else if (best[ix] == cnt[ix])
        rbest[ix] = rbest[par];
      else {
        int psub = 0;
        if (best[ix] == bsub[par]) {
          if (rbest[par] - bsub[par] == n - cnt[ix]) {
            best[ix] += rbest[par] - bsub[par];
          } else {
            psub = rbest[par] - bsub[par] + csub[par];
          }
        } else {
          psub = rbest[par];
        }
        rbest[ix] = best[ix] - bsub[ix];
        if (psub > bsub[ix]) {
          csub[ix] = bsub[ix];
          bsub[ix] = psub;
        } else if (psub > csub[ix]) {
          csub[ix] = psub;
        }
        rbest[ix] += bsub[ix];
      }
    }
    for (auto i : ed[ix])
      if (i != par) {
        dfs2(i, ix);
      }
  }
  int doit(int k) {
    int lo = 0, hi = 1000000007, mid;
    while (lo + 1 < hi) {
      mid = (lo + hi) / 2;
      dfs(mid);
      dfs2();
      bool can = false;
      for (int i = 0; i < n && !can; i++) {
        if (rbest[i] >= k) {
          can = true;
        }
      }
      if (can)
        lo = mid;
      else
        hi = mid;
    }
    return lo;
  }
};
int main() {
  int n = getint(), k = getint();
  graphal g(n);
  g.loadvals();
  g.load(n - 1);
  cout << g.doit(k) << endl;
  return 0;
}
