#include <bits/stdc++.h>
int Set(int N, int pos) { return N = N | (1 << pos); }
int reSet(int N, int pos) { return N = N & ~(1 << pos); }
bool check(int N, int pos) { return (bool)(N & (1 << pos)); }
using namespace std;
vector<int> G[200007];
int vis[200007], color[200007];
void dfs(int u, int p) {
  vis[u]++;
  printf("%d ", u);
  int v, sz = G[u].size();
  for (int i = 0; i < sz; i++) {
    v = G[u][i];
    if (v != p) {
      dfs(v, u);
      vis[u]++;
      printf("%d ", u);
      if ((vis[v] + color[v]) % 2 == 1) {
        printf("%d %d ", v, u);
        vis[u]++;
        vis[v]++;
      }
    }
  }
}
int main() {
  int n, a, b;
  scanf("%d", &n);
  bool f = false;
  for (int i = 1; i < n + 1; i++) {
    scanf("%d", &a);
    if (a == -1)
      color[i] = 1;
    else
      color[i] = 0;
    if (color[i]) f = true;
  }
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &a, &b);
    G[a].push_back(b);
    G[b].push_back(a);
  }
  if (!f)
    puts("1");
  else {
    memset(vis, 0, sizeof vis);
    vis[1]++;
    dfs(1, -1);
    if ((vis[1] + color[1]) % 2 == 1) {
      printf("%d 1 %d\n", G[1][0], G[1][0]);
    }
  }
  return 0;
}
