#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int n, k;
int arr[MAXN];
vector<int> edges[MAXN];
int sub[MAXN];
int num[MAXN];
int mid;
int subans[MAXN];
void df(int node = 1, int p = 0) {
  sub[node] = 1;
  num[node] = arr[node] >= mid;
  for (int g : edges[node]) {
    if (g == p) continue;
    df(g, node);
    sub[node] += sub[g];
    num[node] += num[g];
  }
}
void pre(int node = 1, int p = 0) {
  int cur = 0, cur2 = 0;
  for (int g : edges[node]) {
    if (g == p) continue;
    pre(g, node);
    if (sub[g] == num[g])
      cur += sub[g];
    else
      cur2 = max(cur2, subans[g]);
  }
  if (arr[node] >= mid)
    subans[node] = 1 + cur + cur2;
  else
    subans[node] = 0;
}
int ma = 0;
void solve(int node = 1, int p = 0, int val = 0) {
  if (arr[node] >= mid) {
    int f1 = 1, f2 = 0;
    if (n - sub[node] == num[1] - num[node])
      f1 += n - sub[node];
    else
      f2 = val;
    for (int g : edges[node]) {
      if (g == p) continue;
      if (sub[g] == num[g])
        f1 += sub[g];
      else
        f2 = max(f2, subans[g]);
    }
    ma = max(ma, f1 + f2);
  }
  if (arr[node] < mid) {
    for (int g : edges[node]) {
      if (g == p) continue;
      solve(g, node, 0);
    }
    return;
  }
  int s1 = 1, za1 = 0, za2 = 0;
  if (n - sub[node] == num[1] - num[node])
    s1 += n - sub[node];
  else
    za1 = val;
  for (int g : edges[node]) {
    if (g == p) continue;
    if (sub[g] == num[g])
      s1 += sub[g];
    else {
      if (subans[g] > za1) {
        swap(za1, za2);
        za1 = subans[g];
      } else if (subans[g] > za2)
        za2 = subans[g];
    }
  }
  for (int g : edges[node]) {
    if (g == p) continue;
    int cs1 = s1, cza1 = za1, cza2 = za2;
    if (sub[g] == num[g])
      cs1 -= sub[g];
    else {
      if (subans[g] == cza1) swap(cza1, cza2);
    }
    solve(g, node, cs1 + cza1);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> k;
  for (int g = 1; g <= n; g++) cin >> arr[g];
  for (int g = 0; g < n - 1; g++) {
    int a, b;
    cin >> a >> b;
    edges[a].push_back(b);
    edges[b].push_back(a);
  }
  int lo = 1, hi = 1000000;
  while (hi > lo) {
    mid = (hi + lo + 1) / 2;
    for (int y = 0; y < MAXN; y++) num[y] = 0, subans[y] = 0;
    ma = 0;
    df();
    pre();
    solve();
    if (ma >= k)
      lo = mid;
    else
      hi = mid - 1;
  }
  cout << lo;
  return 0;
}
