#include <bits/stdc++.h>
using namespace std;
int h[222222] = {};
bool vis[222222] = {};
struct ff {
  int x, y;
} f[222222] = {};
int weizhi[222222] = {}, shuliang[222222] = {};
int e[444474] = {};
int size[222222] = {};
int tou, wei, q[222222] = {};
int rudu[222222] = {};
int gen[222222] = {};
int temp[222222] = {};
int ff[222222] = {};
int dep[222222] = {};
int id[444444] = {};
int nextggg[444444] = {};
void update(int s) {
  int tm = ff[s];
  for (int i = weizhi[s]; i < weizhi[s + 1]; i++)
    if (e[i] != gen[s])
      ff[e[i]] = tm + 1, id[tm + 1] = e[i], tm += size[e[i]] * 2, id[tm] = s;
}
void up(int s) {
  printf("%d %d ", gen[s], s);
  h[s] = -h[s], h[gen[s]] = -h[gen[s]];
}
void getpath(int s, int t) {
  int tot = 0;
  if (dep[s] < dep[t]) {
    int tm = t;
    while (tm != s) h[tm] = -h[tm], temp[++tot] = tm, tm = gen[tm];
    for (int i = tot; i > 0; i--) printf("%d ", temp[i]);
    if (h[t] == -1) up(t);
  } else {
    printf("%d ", gen[s]);
    h[t] = -h[t];
    if (h[t] == -1 && t != 1) up(t);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &h[i]);
  for (int i = 1; i < n; i++)
    scanf("%d%d", &f[i].x, &f[i].y), shuliang[f[i].x]++, shuliang[f[i].y]++;
  for (int i = 1; i <= n + 1; i++) weizhi[i] = weizhi[i - 1] + shuliang[i - 1];
  for (int i = 1; i < n; i++)
    e[weizhi[f[i].x]] = f[i].y, e[weizhi[f[i].y]] = f[i].x, weizhi[f[i].x]++,
    weizhi[f[i].y]++;
  for (int i = n + 1; i > 0; i--) weizhi[i] = weizhi[i - 1];
  tou = 0, wei = 0, q[0] = 1;
  while (tou <= wei) {
    int te = q[tou];
    for (int i = weizhi[te]; i < weizhi[te + 1]; i++)
      if (e[i] != gen[te])
        q[++wei] = e[i], gen[e[i]] = te, dep[e[i]] = dep[te] + 1;
    tou++;
  }
  for (int i = 1; i <= n; i++) rudu[i] = shuliang[i] - 1;
  rudu[1]++;
  tou = 0, wei = -1;
  for (int i = 1; i <= n; i++)
    if (rudu[i] == 0) q[++wei] = i;
  while (tou <= wei) {
    int te = q[tou];
    rudu[gen[te]]--;
    if (rudu[gen[te]] == 0) q[++wei] = gen[te];
    size[te] = 1;
    for (int i = weizhi[te]; i < weizhi[te + 1]; i++) size[te] += size[e[i]];
    tou++;
  }
  ff[1] = 1;
  tou = 0, wei = 0;
  q[0] = 1;
  id[1] = 1;
  while (tou <= wei) {
    int te = q[tou];
    update(te);
    for (int i = weizhi[te]; i < weizhi[te + 1]; i++)
      if (e[i] != gen[te]) q[++wei] = e[i];
    tou++;
  }
  for (int i = 1; i < n * 2; i++) nextggg[i] = i + 1;
  int pos = 1;
  for (int i = 2; i < n * 2 - 1; i++)
    if (dep[id[i]] == dep[id[i - 1]] + 1 && dep[id[i]] == dep[id[i + 1]] - 1)
      nextggg[pos] = nextggg[i];
    else
      pos = i;
  int sum = 0;
  for (int i = 1; i <= n; i++)
    if (h[i] == -1) sum++;
  printf("1 ");
  for (int i = 1; i < n * 2 - 2; i = nextggg[i]) getpath(id[i], id[nextggg[i]]);
  if (h[1] == -1) printf("1 ");
  printf("\n");
  return 0;
}
