#include<bits/stdc++.h>
using namespace std;
int v[2000006];
struct Edge{
int to,next;
}edge[4000006];
int last[4000006];
int cnt;
void add(int x,int y)
{
cnt++;
edge[cnt].to=y;
edge[cnt].next=last[x];
last[x]=cnt;
}
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main()
{
int q;
q=read();
while(q--)
{
memset(last,0,sizeof(last));
memset(v,0,sizeof(v));
int n;
int m;
cnt=0;
n=read();
m=read();
int max1=-1;
int num1;
for(int i=1;i<=n;i++)
{
v[i]=read();
if(v[i]>max1)
{
max1=v[i];
num1=i;
}
}
for(int i=1;i<=n-1;i++)
{
int x,y;
x=read();
y=read();
// cout<<x<<" "<<y<<endl;
add(x,y);
add(y,x);
}
if(n==1)
{
cout<<num1<<endl;
continue;
}
int max2=-1;
int num2=edge[last[num1]].to;
for(int i=last[num1];i;i=edge[i].next)
{
if(v[edge[i].to]>max2||(v[edge[i].to]==max2&&edge[i].to<num2))
{
max2=v[edge[i].to];
num2=edge[i].to;
}
}
// cout<<num1<<" "<<num2<<endl;
if(max1-max2>m)
{
cout<<num1<<endl;
continue;
}
else
{
if((m-max1+max2)%2==0)
{
if(num1<num2)
{
cout<<num1<<endl;
continue;
}
else
{
cout<<num2<<endl;
continue;
}
}
if((m-max1+max2)%2!=0)
{
if(num1>num2)
{
cout<<num1<<endl;
continue;
}
else
{
cout<<num2<<endl;
continue;
}
}
}
}
return 0;
}