#include <bits/stdc++.h>
using namespace std;
int n, m, a[200005], head[200005];
struct edge {
  int to, nxt;
  edge(int _t = -1, int _n = -1) {
    to = _t;
    nxt = _n;
  }
} e[400005];
void addedge(int u, int v) {
  e[m] = edge(v, head[u]);
  head[u] = m++;
  e[m] = edge(u, head[v]);
  head[v] = m++;
}
vector<int> g;
int dp[200005], s;
void dfs1(int fa, int u) {
  if (a[u] == -1)
    dp[u] = 1;
  else
    dp[u] = 0;
  for (int p = head[u]; p != -1; p = e[p].nxt) {
    int v = e[p].to;
    if (v == fa) continue;
    dfs1(u, v);
    dp[u] += dp[v];
  }
}
void dfs2(int fa, int u) {
  if (s == 0 || dp[u] == 0) return;
  int x;
  for (int p = head[u]; p != -1; p = e[p].nxt) {
    int v = e[p].to;
    x = v;
    if (v == fa || dp[v] == 0) continue;
    g.push_back(v + 1);
    if (a[v] == -1) {
      s--;
      dp[v]--;
    } else {
      s++;
      dp[v]++;
    }
    a[v] = -a[v];
    dfs2(u, v);
    if (s == 0) return;
    g.push_back(u + 1);
    if (a[u] == -1) {
      s--;
      dp[u]--;
    } else {
      s++;
      dp[u]++;
    }
    a[u] = -a[u];
  }
  if (a[u] == -1) {
    a[u] = 1;
    if (fa == -1) {
      g.push_back(x + 1);
      g.push_back(1);
      g.push_back(x + 1);
      return;
    } else {
      g.push_back(fa + 1);
      g.push_back(u + 1);
      s--;
      dp[u]--;
      if (a[fa] == -1) {
        s--;
        dp[fa]--;
      } else {
        s++;
        dp[fa]++;
      }
      a[fa] = -a[fa];
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    scanf("%d", &a[i]);
    if (a[i] == -1) s++;
  }
  memset(head, -1, sizeof(head));
  m = 0;
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    addedge(u - 1, v - 1);
  }
  if (s == 0) {
    printf("1\n");
    return 0;
  }
  g.clear();
  dfs1(-1, 0);
  dfs2(-1, 0);
  printf("1");
  for (int i = 0; i < g.size(); ++i) printf(" %d", g[i]);
  printf("\n");
  return 0;
}
