#include <bits/stdc++.h>
#define MOD 100000000
#define MAX 2005

using namespace std;

void test_case(){
    long long n, m;
    cin>>n>>m;
    vector<long long> arr(n);
    for(int i=0; i<n; i++)cin>>arr[i];
    sort(arr.begin(), arr.end());
//    for(auto i:arr)cout<<i<<' ';
//    cout<<endl;
    int q;
    cin>>q;
    vector<long long> acc(n);
    acc[0] = arr[0];
    for(int i=1; i<n; i++)acc[i] = acc[i-1] ^ arr[i];
    for(int i=0; i<q; i++){
        long long l, r;
        cin>>l>>r;
        long long ret = 0;
        auto be = lower_bound(arr.begin(), arr.end(), l) - arr.begin();
        auto en = upper_bound(arr.begin(), arr.end(), r) - arr.begin();
        en--;
//        cout<<be<<' '<<en<<endl;
        if(be == 0)ret = acc[en];
        else ret = acc[en] ^ acc[be-1];
        if(ret <=l)cout<<'B';
        else cout<<'A';

//        cout<<reta<<' '<<l<<' '<<retb<<endl;
//        if(ret == 0)cout<<'B';
//        else cout<<'A';
    }
}

vector<int> color, ans;
vector<vector<int>> adj;
map<int, int> taken;

void solve(int x, int par = -1){
//    cout<<x<<' ';
    if(!taken[color[x]]){
        ans.push_back(x+1);
        taken[color[x]] ++;
        for(int i=0; i<adj[x].size(); i++){
            if(adj[x][i] == par)continue;
            solve(adj[x][i], x);
        }
        taken[color[x]] --;
    }
    else {
        for(int i=0; i<adj[x].size(); i++){
            if(adj[x][i] == par)continue;
            solve(adj[x][i], x);
        }
    }
}

int main() {
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n;
    cin>>n;
    color.resize(n);
    adj.resize(n);
    for(int i=0; i<n; i++)cin>>color[i];
    for(int i=0; i<n-1;i++){
        int x, y;
        cin>>x>>y;
        x--, y--;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    solve(0);
    sort(ans.begin(), ans.end());
    for(auto x:ans)cout<<x<<endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define _GLIBCXX_DEBUG //これつけるとA[N]でもいいらしい
//for文のマクロ
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mp(a,b) make_pair(a,b)
#define big 1000000007
#define all(a) sort((a).begin(),(a).end()) //ソートのマクロ
#define Re(a) reverse((a).begin(),(a).end())
#define YN(a) if(a){cout<<"Yes"<<endl;}else cout<<"No"<<endl;//条件によってYes、Noを出力する
vector<int> G[100002];
int visited[100002]={};
int c[100002]={};
vector<int> cm(100002,0);
vector<int> ans={};
//今まで見ている点でどの色が何回出たか
void dfs(int now){
    //cout<<"今から"<<now+1<<"を探索"<<endl;
    // cout<<"もうある色"<<endl;
    // for(auto color:cm){
    //    cout<<color.first<<" ";
    // }
    //cout<<endl;
    visited[now]=1;
    if(cm[c[now]]==0){
        ans.push_back(now+1);
    }
    cm[c[now]]+=1;
    for(int j=0;j<G[now].size();j++){
        int child = G[now][j];
        if(!visited[child]){  
            dfs(child);
        }
    }
    cm[c[now]]--;
}
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    
    //vector<int> c(n);
    vector<int> a(n),b(n);
    int maxc=0;
    rep(i,n){
        cin>>c[i];
        c[i]--;
        maxc = max(c[i],maxc);
    }
    rep(i,n-1){
        cin>>a[i]>>b[i];
        a[i]--,b[i]--;
        G[a[i]].push_back(b[i]);
        G[b[i]].push_back(a[i]);
    }
    // for(int i=0;i<n;i++){
    //     cout << "G[" <<i <<"]={";
    //     for(int j=0;j<G[i].size();j++){
    //         cout<<G[i][j]<<" ";
    //     }
    //     cout<<"}"<<endl;
    // }

    // rep(i,maxc+1){
    //     cout<<cm[i]<<endl;
    // }
    dfs(0);
    all(ans);
    for(auto node: ans){
        cout<<node<<endl;
    }
    return 0;
}