#include <bits/stdc++.h>
#define mis(x) cout << #x <<" = " <<x<<endl
#define rep(i, a, b) for(int i=(a);(i)<(b);(i)++)
#define re(i,a) rep((i),0,(a))
#define eb emplace_back
#define x first
#define y second
	//	#define cin fin
using namespace std;
typedef long long ll;
ifstream fin("Sisend.txt");
//ifstream fin("tagavarafail.txt");
void ye(bool b){cout<<(b? "Yes\n":"NO\n");}
const int Ia = INT_MAX, Ii INT_MIN;
ll tt,t,n,m,k,c;
struct item{
	int i,l,r,w;
	bool vas=0;
	vector<int> v;
	void alg(int k){
		i=k,vas=0;
	}
	void paneLR(vector<item> &it,int &in,int yl){
		l=in++;
		sort(v.begin(),v.end());
		for(int j:v)if(j!=yl)	it[j].paneLR(it,in,i);
		r=in;
		return;
	}
};
bool boo(item &a,item &b){
	if(a.w == b.w ) return a.l > b.l;
	return a.w > b.w;
}
struct Node {		//vt v�ikseim aeg, st suurim, vr v�ikseim parem kaug, sr suurim 
    int vt, st, vr, sr, vvr;		//vvr v�ikseim v�ikseima t-ga paremp kaugus
    bool ord,sees,seesk;	//ord �ige j�rjekord, seesk - k�ik �ksteise sees, sees - v�iksemad v�ivad olla k�rvuti
};

class SegmentTree {
    int n,cc;
    vector<Node> t;
    vector<int> Vt,St,Vr,Sr,Vvr;
	vector<bool> Ord,Sees,Seesk;
public:
    SegmentTree(int size) {
        n = size;
        cc=1;while(cc<n)cc<<=1;int d=2*cc+5;
        t.resize(d, {Ia, Ii, Ia, Ii, Ia, true, true, true});
        Vt.resize(d,Ia),St.resize(d,Ii),Vr.resize(d,Ia),Sr.resize(d,Ii),Vvr.resize(d,Ia);
        Ord.resize(d,1),Sees.resize(d,1),Seesk.resize(d,1);
    }
bool leiaSees(int a,int b){
	if(!Sees[a] || !Sees[b])	return false;
	if(Vt[a]	==Ia || 	Vt[b]	==Ia) 	return true; 				//�hte polegi
	if(Vt[a]	==Vt[b])	return Vr[a]>=Sr[b];				//vasak sisaldab paremat
	if(Vt[a]	> Vt[b])	return min(Vr[a],Vvr[a])>=Sr[b];	//vasakpoolses peab ka esimesena pandu sisaldama parempoolset
	return 	Vr[a]>=Sr[b] && Seesk[b];
}
int leiaVr(int a, int b){
	if(Vt[a]	==	Vt[b])	return min(Vr[a],Vr[b]);
	if(Vt[a]	<	Vt[b])	swap(a,b);	//nodes a on hiljem pandud esimene
	if(Vt[a]	==	Ia)		return Vr[b];
	return min(	min(Vr[a],Vvr[a]),	Vr[b]);
}
int leiaVvr(int a, int b){
	if(Vt[a]	==	Vt[b] || Vt[a]==Ia || Vt[b]==Ia)return min(Vvr[a],Vvr[b]);
	return (Vt[a]<Vt[b])? Vvr[a] : Vvr[b];
}
void modify(int p,int ti,int r) {  // set value at position p
	int pp=p;
	p+=cc;
	Vt[p] = ti, St[p] = ti, Ord[p] = 1, Sr[p]=r, Vvr[p]=r;
  	for (p>>=1; p >= 1; p >>= 1){
  		int a=p<<1,b=(p<<1)+1;
  		Vr[p] 	= leiaVr(a,b);				//minimaalne parempoolne
  		Vvr[p]	= leiaVvr(a,b);			//minimaalne parempoolne v�ikseimate aegade hulgast
   		Sr[p] 	= max(Sr[a],Sr[b]),		// piir selle piirkonna punktide alluvatel
    	Vt[p] 	= min(Vt[a],Vt[b]),
		St[p] 	= max(St[a],St[b]),
		Ord[p] 	= Ord[a] 	&& 	Ord[b] 	&& 	Vt[a]>=St[b] ; // ord : kas parempoolse on pandud enne  	
		Sees[p]	= leiaSees(a,b);
		Seesk[p]	= Seesk[a] && Seesk[b] && min(Vr[a],Vvr[a])>=Sr[b];
  	} 
  	return;
}
int leia(vector<int> &t,int l, int r,int res, function<int(int, int)> f){
  for (l += cc, r += cc; l < r; l >>= 1, r >>= 1) {
    if (l&1)  	res = f(res,t[l++]);
    if (r&1)	res = f(res,t[--r]);
  }
  return res;	
}	
int vt(int l, int r){
	return leia(Vt,	l,r,Ia,[](int x,int y) -> int { return min(x,y);});	
}
int vvr(int l, int r){
	return leia(Vvr,l,r,Ia,[](int x,int y) -> int { return min(x,y);});
}
int sr(int l, int r){
	return leia(Sr,	l,r,Ii,[](int x,int y) -> int { return max(x,y);});	
}
int st(int l, int r){
	return leia(St,	l,r,Ii,[](int x,int y) -> int { return max(x,y);});
}
int vr(int l, int r){
  int res = Ia;
  int ti=vt(l,r);
  for (l += cc, r += cc; l < r; l >>= 1, r >>= 1) {
    if (l&1){
    	if(Vt[r]!=ti)res = min(res,Vvr[l]);
    	res = min(res,Vr[l++]);
	}  	
    if (r&1){
    	res = min(res,Vr[--r]);
		if(Vt[r]!=ti)res=min(res,Vvr[r]);
	}	
  }
  return res;	
}
bool seesk(int l, int r){
	bool res=1;
	int vas=Ia,par=Ii;
	  for (l += cc, r += cc; l < r; l >>= 1, r >>= 1) {
	    if (l&1){
	    	res = res && Seesk[l] && vas >= Sr[l] ;
	    	vas = min(vas,min(Vr[l],Vvr[l]));
			l++;	
	 	}	
	    if (r&1){
	    	res = res && Seesk[--r] && min(Vr[r],Vvr[r]) >= par;
	    	par=max(par,Sr[r]);
		}
	  }	
  	res= res && vas>= par;
  return res;	
}
bool sees(int l,int r){
	bool res=1;
	int ti = vt(l,r);
	int vas=Ia,par=Ii;
	  for (l += cc, r += cc; l < r; l >>= 1, r >>= 1) {
	    if (l&1){
	    	res = res && Sees[l] && vas >= Sr[l] ;
	    	vas = min(vas,Vr[l]);
	    	if(Vt[l] != ti){
	    		res = res && Seesk[l];
	    		vas = min(vas,Vvr[l]);
			}
			l++;	
	 	}	
	    if (r&1){
	    	res = res && Sees[--r] && Vr[r] >= par;
			if(Vt[r] != ti)	res = res && Seesk[r] && Vvr[r] >= par;
	    	par=max(par,Sr[r]);
		}
	  }	
  	res= res && vas>= par;
  return res;
}
bool query(int l, int r){
	bool res = sees(l,r);
	
	int lp=l,rp=r;
	int vas=Ia,par=Ii;
	for (l += cc, r += cc; l < r; l >>= 1, r >>= 1) {
		if (l&1){
	     	res = res && Ord[l] && vas>= St[l];
	    	vas=min(vas,Vt[l++]);
		}	
	    if (r&1){
	    	res = res && Ord[--r] && Vt[r] >= par;
	    	par=max(par,St[r]);
	 	} 
	}
  	res= res && vas>= par; 
  return res;	
}
};
int main(){
    freopen("in","r",stdin);
    freopen("out1","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);	cout.tie(0);cerr.tie(0);
	cin>>tt;while(tt--){
		cin>>n;
		vector<item> it(n);
		re(i,n){
			it[i].alg(i);
			cin>>it[i].w;
		}
		re(i,n-1){
			int a,b;cin>>a>>b;a--,b--;
			it[a].v.eb(b),it[b].v.eb(a);
		}
		int in=0;
		it[0].paneLR(it,in,-1);//l�bib graafi, leiab iga node alluvate piirid, node ise asub kohal l;
		sort(it.begin(),it.end(),boo); //suuremad v��rtused enne
	   	SegmentTree t(n);
		in=0;int tase=0;
		re(i,n){
			if( i and it[i].w < it[i-1].w ){
				tase++;
				in=i;
				while(in<n-1 and it[in+1].w==it[in].w)in++;
				for(int j = i; j <= in ; j++){
					int c=Ia,d=Ia; 
					if(it[j].l)c = t.vt( 0, it[j].l );
					if(it[j].r<n)d = t.vt( it[j].r, n );
					
					if(c == Ia){							
						if(d!=Ia)	it[j].vas = t.query(it[j].r,n);
					}			
					else{
						if(d==Ia){
							
							it[j].vas = t.query(0,it[j].l);
							
						}	
						else if(c>=d){
							bool res= t.query(0,it[j].l) && t.query(it[j].r,n);
							if(c==d){//paremal saavad olla vaid v�ikseimad
								res= res && t.vr(0,it[j].l)>= t.sr(it[j].r,n) && d == t.st( it[j].r, n );
							}else if(c>d){//paremas esimesena pandud
								res= res &&	 min(t.vvr(0,it[j].l),t.vr(0,it[j].l)) >= t.sr(it[j].r,n) &&
									 t.seesk(0,it[j].l) && c>=t.st( it[j].r, n );
							}
							it[j].vas=res;
						}
					}
				}
				if(in==n-1)break;
			}
			t.modify(it[i].l,tase,it[i].r);
		}
		vector<int> v;
		re(i,n)if(it[i].vas)v.eb(it[i].i+1);
		sort(v.begin(),v.end());
		cout<<v.size()<<" ";
		for(int i:v)cout<<i<<" ";
		cout<<"\n";
	}
}
#if defined(_USE_PCH_)
#include "pch.hpp"
#else
#include <bits/stdc++.h>
#endif
#define RNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_<=V_##_END; V_++)
#define IRNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_>=V_##_END; V_--)
#ifdef _WIN32
#define long int64_t
#endif
#define fir first
#define sec second
#define _UN using namespace
using namespace std;
typedef pair<int,int> pii;
typedef __int128 i128;
const int MAXN=4e5+10,INF=0x3f3f3f3f,NINF=0xc0c0c0c0; const long INFL=0x3f3f3f3f3f3f3f3f;
int n,A[MAXN]; vector<int> G[MAXN],del[MAXN];
int dfn[MAXN],dfne[MAXN],dfnc;
int ord[MAXN],mx[MAXN]; vector<int> ans;
void dfs1(int u,int fa_,int mx_){
    dfn[u]=++dfnc,mx[u]=mx_;
    for(int v:G[u]){
        if(v!=fa_) dfs1(v,u,max(mx_,A[u]));
    }
    dfne[u]=dfnc;
}
struct X{ long mx,mxc; };
X operator+(X x,X y){ return {max(x.mx,y.mx),(x.mx==max(x.mx,y.mx)?x.mxc:0)+(y.mx==max(x.mx,y.mx)?y.mxc:0)}; }
X operator+(X x,long y){ x.mx+=y; return x; }
struct SGT2{
#define ls (u<<1)
#define rs (u<<1|1)
    const static int MAXN=1<<20;
    X mx[MAXN]; long tag[MAXN]; int len;
    void init(){
        for(len=1; len<(n+2); len<<=1) ;
        fill_n(mx,len*2,X{NINF,0}),fill_n(tag,len*2,0);
    }
    void pushup(int u){ mx[u]=(mx[ls]+tag[ls])+(mx[rs]+tag[rs]); }
    void upd(int i,X x){
        int u=len+i; mx[u]=x;
        for(u>>=1; u; u>>=1) pushup(u);
    }
    void upd(int l,int r,long x){
        int u=len+l-1,v=len+r+1;
        for(; u^v^1; u>>=1,v>>=1,pushup(u),pushup(v)){
            if(~u&1) tag[u^1]+=x;
            if( v&1) tag[v^1]+=x;
        }
        for(; u; u>>=1,v>>=1) pushup(u);
    }
    X qry(int l,int r){
        if(l>r) return {NINF,0};
        X retl{NINF,0},retr{NINF,0};
        int u=len+l-1,v=len+r+1;
        for(; u^v^1; u>>=1,v>>=1,retl=retl+tag[u],retr=retr+tag[v]){
            if(~u&1) retl=retl+(mx[u^1]+tag[u^1]);
            if( v&1) retr=retr+(mx[v^1]+tag[v^1]);
        }
        for(; u; u>>=1,v>>=1,retl=retl+tag[u],retr=retr+tag[v]) ;
        return retl+retr;
    }
#undef ls
#undef rs
} sgt1;
struct BIT{
    int A[MAXN];
    void init(){ fill_n(A+1,n,0); }
    void upd(int i,int x){
        for(; i<=n; i+=i&-i) A[i]+=x;
    }
    int qry(int i){
        int ret=0;
        for(; i; i-=i&-i) ret+=A[i];
        return ret;
    }
    int qry(int l,int r){ return l<=r?qry(r)-qry(l-1):0; }
} bit,bit2;
int curcas;
void case_main(){
    cin>>n;
    RNG(i,1,n) cin>>A[i];
    RNG(i,1,n) G[i].clear(),del[i].clear();
    RNG(_,1,n-1,u,v) cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
    sgt1.init(); bit.init(); bit2.init();
    dfnc=0; dfs1(1,0,0);
    iota(ord+1,ord+n+1,1),sort(ord+1,ord+n+1,[](int u,int v){ return A[u]>A[v]; });
    ans.clear();
    vector<int> vec;
    RNG(p,1,n){
        {
            int u=ord[p];
            auto x=bit.qry(1,dfn[u]-1)+bit.qry(dfne[u]+1,n);
            auto z=bit2.qry(1,dfn[u]-1)+bit2.qry(dfne[u]+1,n);
            auto y=sgt1.qry(1,dfn[u]-1)+sgt1.qry(dfne[u]+1,n);
            if(!z&&x&&y.mx<INF&&x==y.mx%(n+1)+y.mxc-1) ans.push_back(u);
            vec.push_back(u);
        }
        if(A[ord[p+1]]!=A[ord[p]]){
            sort(vec.begin(),vec.end(),[](int v1,int v2){ return dfn[v1]>dfn[v2]; });
            for(int u:vec){
                bit.upd(dfn[u],1);
                sgt1.upd(dfn[u],{1l*A[u]*(n+1),1});
                sgt1.upd(dfn[u],dfne[u],1);
                if(mx[u]>A[u]) bit2.upd(dfn[u],1),bit2.upd(dfne[u]+1,-1);
            }
            vec.clear();
        }
    }
    sort(ans.begin(),ans.end());
    cout<<ans.size()<<" ";
    for(int u:ans) cout<<u<<" ";
    cout<<"\n";
}
int main(){
#if defined(_LOCAL_)
    freopen("in","r",stdin);
    freopen("out","w",stdout);
//  freopen("/dev/null","w",stderr);
#else
//  freopen("tree.in","r",stdin);
//  freopen("tree.out","w",stdout);
#endif
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int cas; cin>>cas;
    RNG(_,1,cas) curcas=_,case_main();
}
1
10
1 1 6 3 6 3 7 4 4 7 
1 2
1 3
2 4
2 5
5 6
4 7
6 8
6 9
4 10