#include
#include
#include
#include
#include
//#include
using namespace std;
const int INF = 2e9;
const int maxn = 3e5 + 10;
typedef long long ll;
int n;
ll k;
vector graph[maxn];
int a[maxn];
void brute_force() {
int S = 0;
for(int i = 0; i < k; i++) {
vector visited(n + 1, false);
visited[S] = true;
queue q;
q.push(S);
q.push(0);
int max_dist = -INF;
int next_node = -1;
while(!q.empty()) {
int node = q.front();
q.pop();
int dist = q.front();
q.pop();
if(a[node] - dist > max_dist and S != node) {
max_dist = a[node] - dist;
next_node = node;
}
if(a[node] - dist == max_dist and S != node) {
next_node = min(next_node, node);
}
for(int neighbour : graph[node]) {
if(!visited[neighbour]) {
visited[neighbour] = true;
q.push(neighbour);
q.push(dist + 1);
}
}
}
S = next_node;
}
cout << S + 1 << endl;
}
void solve_subtask2() {
int S = 0;
vector cnt(n + 1, 0);
vector cycle;
bool cycle_begin = false;
int till_cycle = 0;
for(int i = 0; i < 10000; i++) {
vector visited(n + 1, false);
visited[S] = true;
int next_node = -1, max_dist = -INF;
queue q;
q.push(S);
q.push(0);
cnt[S]++;
if(cnt[S] == 2) {
cycle_begin = true;
// cout << S + 1 << endl;
}
if(cycle_begin) {
cycle.push_back(S);
}
else {
till_cycle++;
}
while(!q.empty()) {
int node = q.front();
q.pop();
int dist = q.front();
q.pop();
if(a[node] - dist > max_dist and S != node) {
max_dist = a[node] - dist;
next_node = node;
}
if(a[node] - dist == max_dist and S != node) {
next_node = min(next_node, node);
}
for(int neighbour : graph[node]) {
if(!visited[neighbour]) {
visited[neighbour] = true;
q.push(neighbour);
q.push(dist + 1);
}
}
}
S = next_node;
if(cycle_begin and S == cycle[0]) {
// for(int x : cycle) {
// cout << x + 1 << " " ;
// }
break;
}
}
// cout << endl;
// cout << "till: " << till_cycle - cycle.size() - 1<< endl;
// cout << cycle.size() << endl;
till_cycle = till_cycle - cycle.size() - 1;
k -= till_cycle;
// cout << k << endl;
cout << cycle[(k + 1) % (ll) cycle.size()] + 1 << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> k;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
for(int i = 1; i < n; i++) {
int a, b;
cin >> a >> b;
a--; b--;
graph[a].push_back(b);
graph[b].push_back(a);
}
if(n <= 1000 and k <= 1000) {
brute_force();
return 0;
}
if(n <= 1000) {
solve_subtask2();
return 0;
}
return 0;
}