#include <iostream>
using namespace std;
const int maxn=210;
pair<int,int> fat[maxn][maxn];
int size[maxn][maxn];
int n,k,p;
bool pis(pair<int,int> a,pair<int,int> b){
return (a.first==b.first&&a.second==b.second);
}
pair<int,int> find(int x,int y){
if(pis(fat[x][y],make_pair(x,y))) return make_pair(x,y);
pair<int,int> root=find(fat[x][y].first,fat[x][y].second);
return fat[x][y]=root;
}
bool in(int x1,int y1,int x2,int y2){
pair<int,int> xr=find(x1,y2),yr=find(x2,y2);
return pis(xr,yr);
}
void merge(int x1,int Y1,int x2,int Y2){
pair<int,int> xr=find(x1,Y1);
pair<int,int> yr=find(x2,Y2);
if(size[xr.first][xr.second]>=size[yr.first][yr.second]) fat[yr.first][yr.second]=fat[xr.first][xr.second],size[xr.first][xr.second]+=size[yr.first][yr.second];
else fat[xr.first][xr.second]=fat[yr.first][yr.second],size[yr.first][yr.second]+=size[xr.first][xr.second];
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
int x,y;
char ch;
cin>>x>>y>>ch;
if(ch=='D') merge(x,y,x,y-1);
else merge(x,y,x+1,y);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
vector<int> g[MAXN];
int color[MAXN];
int cnt[MAXN]; // 当前路径上每种颜色的出现次数
vector<int> ans;
void dfs(int u, int parent) {
// 判断当前点是否是好点
if (cnt[color[u]] == 0) {
ans.push_back(u);
}
// 进入:颜色计数+1
cnt[color[u]]++;
for (int v : g[u]) {
if (v != parent) {
dfs(v, u);
}
}
// 回溯:颜色计数-1
cnt[color[u]]--;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> color[i];
}
for (int i = 0; i < N - 1; i++) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs(1, 0);
// 按升序输出(DFS天然从1开始,但为保证顺序可排序)
sort(ans.begin(), ans.end());
for (int x : ans) {
cout << x << '\n';
}
return 0;
}