#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f7f7f7f;
const int MAXN = 200005;
const double eps = 1e-10;
struct node {
  int en, len, next;
  node(int en = 0, int len = 0, int next = 0) : en(en), len(len), next(next) {}
};
struct node E[MAXN * 2];
int p[MAXN], num;
void init() {
  memset(p, -1, sizeof(p));
  num = 0;
}
void add(int st, int en, int len) {
  E[num] = node(en, len, p[st]);
  p[st] = num++;
}
int flag[MAXN], val[MAXN], cnt[MAXN];
vector<int> ans;
void dfs(int u, int fa) {
  int ch = 0;
  for (int i = p[u]; i != -1; i = E[i].next) {
    int v = E[i].en;
    if (v != fa) {
      ch++;
      dfs(v, u);
      cnt[u] += cnt[v];
    }
  }
  if (ch == 0) {
    flag[u] = 1;
  }
  cnt[u] += val[u] == -1 ? 1 : 0;
}
void DFS(int u, int fa) {
  for (int i = p[u]; i != -1; i = E[i].next) {
    int v = E[i].en;
    if (v != fa) {
      ans.push_back(v);
      val[v] = val[v] == 1 ? -1 : 1;
      DFS(v, u);
      val[u] = val[u] == 1 ? -1 : 1;
      ans.push_back(u);
      if (val[v] == 1) {
        cnt[u] -= cnt[v];
        continue;
      } else {
        if (val[v] == -1) {
          ans.push_back(v);
          ans.push_back(u);
          val[u] = val[u] == 1 ? -1 : 1;
          cnt[u] -= cnt[v];
        }
      }
    }
  }
}
int main() {
  int n, i, ge = 0, yes;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%d", &val[i]);
    if (val[i] == -1) ge++;
  }
  init();
  for (i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v, 0);
    add(v, u, 0);
  }
  if (ge == 0) {
    puts("1");
    return 0;
  }
  ans.clear();
  memset(cnt, 0, sizeof(cnt));
  memset(flag, 0, sizeof(flag));
  dfs(1, -1);
  ans.push_back(1);
  DFS(1, -1);
  int sz = ans.size();
  if (val[1] == -1) sz--;
  for (i = 0; i < sz; i++) {
    printf("%d", ans[i]);
    if (i == sz - 1)
      puts("");
    else
      printf(" ");
  }
  return 0;
}
