#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define rep(i,a) for(i=first[a];i;i=next[i])
using namespace std;
const int maxn=1e6+7;
int i,j,k,l,t,n,m,ans,cas,x,y;
int first[maxn],last[maxn],next[maxn],a[maxn],num;
int f[maxn][21],deep[maxn];
int bz[maxn],az[maxn],hou[maxn],an[maxn],du[maxn],d[maxn];
int get(){
char ch=getchar();int x=0;
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
void add(int x,int y){
last[++num]=y,next[num]=first[x],first[x]=num;
}
void bfs(){
int i,head=0,tail=0,x;
fo(i,1,n)if(!du[i])d[++tail]=i;deep[1]=1;
while(head<tail){
x=d[++head];
rep(i,x){
du[last[i]]--;if(!du[last[i]])d[++tail]=last[i];
f[last[i]][0]=x;deep[last[i]]=deep[x]+1;
}
}
}
int lca(int x,int y){
int i;if(deep[x]<deep[y])swap(x,y);
fod(i,20,0)if(deep[f[x][i]]>deep[y])x=f[x][i];
if(deep[x]!=deep[y])x=f[x][0];
fod(i,20,0)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
if(x!=y)return f[x][0];return x;
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
for(scanf("%d",&cas);cas;cas--){
num=0,memset(first,0,sizeof(first));memset(bz,0,sizeof(bz));
memset(an,255,sizeof(an));memset(du,0,sizeof(du));
scanf("%d%d",&n,&m);
fo(i,1,n)a[i]=get();
fod(i,n,1){
hou[i]=bz[a[i]];bz[a[i]]=i;
}
fo(i,1,n-1)k=get(),l=get(),add(k,l),du[l]++;
bfs();fo(j,1,20)fo(i,1,n)f[i][j]=f[f[i][j-1]][j-1];
fo(i,0,m){
x=bz[i];y=0;
if(!x){
fo(j,1,n)if(an[j]==-1)an[j]=i;break;
}
while(x){
if(!y)y=x;
else y=lca(y,x);
x=hou[x];
}
while(y&&an[y]==-1)an[y]=i,y=f[y][0];
}
fo(i,1,n){if(an[i]==-1)an[i]=0;printf("%d ",an[i]);}
printf("\n");
}
}