#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; const long INFL=0x3f3f3f3f3f3f3f3f;
int n,A[MAXN]; vector<int> G[MAXN];
int dfn[MAXN],dfne[MAXN],dfnc;
int ord[MAXN]; vector<int> ans;
void dfs1(int u,int fa_){
    dfn[u]=++dfnc;
    for(int v:G[u]){
        if(v!=fa_) dfs1(v,u);
    }
    dfne[u]=dfnc;
}
struct SGT1{
#define ls (u<<1)
#define rs (u<<1|1)
    const static int MAXN=1<<20;
    int mx[MAXN],len;
    void init(){
        for(len=1; len<(n+2); len<<=1) ;
        fill_n(mx,len*2,0);
    }
    void upd(int l,int r,int x){
        for(int u=len+l-1,v=len+r+1; u^v^1; u>>=1,v>>=1){
            if(~u&1) mx[u^1]=max(mx[u^1],x);
            if( v&1) mx[v^1]=max(mx[v^1],x);
        }
    }
    int qry(int i){
        int ret=0;
        for(int u=len+i; u; u>>=1) ret=max(ret,mx[u]);
        return ret;
    }
#undef ls
#undef rs
} sgt1;
struct SGT2{
#define ls (u<<1)
#define rs (u<<1|1)
    const static int MAXN=1<<20;
    int mx[MAXN],len;
    void init(){
        for(len=1; len<(n+2); len<<=1) ;
        fill_n(mx,len*2,0);
    }
    void pushup(int u){ mx[u]=max(mx[ls],mx[rs]); }
    void upd(int i,int x){
        int u=len+i; mx[u]=x;
        for(u>>=1; u; u>>=1) pushup(u);
    }
    int qry(int l,int r){
        if(l>r) return 0;
        int ret=0;
        for(int u=len+l-1,v=len+r+1; u^v^1; u>>=1,v>>=1){
            if(~u&1) ret=max(ret,mx[u^1]);
            if( v&1) ret=max(ret,mx[v^1]);
        }
        return ret;
    }
#undef ls
#undef rs
} sgt2;
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;
void case_main(){
    cin>>n;
    RNG(i,1,n) cin>>A[i];
    RNG(i,1,n) G[i].clear();
    RNG(_,1,n-1,u,v) cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
    sgt1.init(),sgt2.init(); bit.init();
    dfnc=0; dfs1(1,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];
        if(auto x=bit.qry(1,dfn[u]-1)+bit.qry(dfne[u]+1,n); x&&x==max(sgt2.qry(1,dfn[u]-1),sgt2.qry(dfne[u]+1,n))) ans.push_back(u);
        vec.push_back(u);
        if(A[ord[p+1]]!=A[u]){
            sort(vec.begin(),vec.end(),[](int v1,int v2){ return dfn[v1]<dfn[v2]; });
            for(int u:vec){
                bit.upd(dfn[u],1);
                auto x=sgt1.qry(dfn[u])+1;
                sgt2.upd(dfn[u],x),sgt1.upd(dfn[u],dfne[u],x);
            }
            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) case_main();
}