#include <bits/stdc++.h>
using namespace std;
const int M = 1e5 + 20;
int goal[M], init[M];
vector<int> adj[M];
vector<int> ans;
int dpo[M], dpe[M];
bool mark[M];
int n;
void dfs(int u, int level, int o, int e) {
  mark[u] = true;
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i];
    if (!mark[v]) {
      if (level == 1) {
        if ((goal[v] != init[v] && dpe[u] % 2 == 0) ||
            (goal[v] == init[v] && dpe[u] % 2 == 1)) {
          ans.push_back(v);
          dpo[v] = dpo[u];
          dpe[v] = dpe[u] + 1;
          dfs(v, 0, dpo[v], dpe[v]);
        }
        if ((goal[v] == init[v] && dpe[u] % 2 == 0) ||
            (goal[v] != init[v] && dpe[u] % 2 == 1)) {
          dpo[v] = dpo[u];
          dpe[v] = dpe[u];
          dfs(v, 0, dpo[v], dpe[v]);
        }
      }
      if (level == 0) {
        if ((goal[v] != init[v] && dpo[u] % 2 == 0) ||
            (goal[v] == init[v] && dpo[u] % 2 == 1)) {
          ans.push_back(v);
          dpo[v] = dpo[u] + 1;
          dpe[v] = dpe[u];
          dfs(v, 1, dpo[v], dpe[v]);
        }
        if ((goal[v] == init[v] && dpo[u] % 2 == 0) ||
            (goal[v] != init[v] && dpo[u] % 2 == 1)) {
          dpo[v] = dpo[u];
          dpe[v] = dpe[u];
          dfs(v, 1, dpo[v], dpe[v]);
        }
      }
    }
  }
}
int main() {
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 0; i < n; i++) cin >> init[i];
  for (int i = 0; i < n; i++) cin >> goal[i];
  int ee, oo;
  if (goal[0] == init[0]) {
    dpe[0] = ee = 0;
    dpo[0] = oo = 0;
  } else {
    dpe[0] = ee = 0;
    dpo[0] = oo = 1;
    ans.push_back(0);
  }
  dfs(0, 1, oo, ee);
  cout << ans.size() << "\n";
  for (int i = 0; i < (int)ans.size(); i++) {
    cout << ans[i] + 1 << "\n";
  }
}
