#include <bits/stdc++.h>
using namespace std;
vector<int> vis2, vis, a, b, level;
vector<vector<int> > adj;
int si;
int fa = 0;
vector<int> ans;
string s;
void dfs(int cur, int lev) {
  level[cur] = lev;
  for (int i = 0; i < adj[cur].size(); i++) {
    if (vis[adj[cur][i]] == 0) {
      vis[adj[cur][i]] = 1;
      dfs(adj[cur][i], lev + 1);
    }
  }
}
void tdfs(int cur, int even, int odd) {
  if (level[cur] % 2 == 0) {
    if (even % 2 == 1) {
      if (a[cur] == 0)
        a[cur] = 1;
      else
        a[cur] = 0;
    }
  } else {
    if (odd % 2 == 1) {
      if (a[cur] == 0)
        a[cur] = 1;
      else
        a[cur] = 0;
    }
  }
  if (a[cur] != b[cur]) {
    fa++;
    ans.push_back(cur + 1);
    if (level[cur] % 2 == 0)
      even++;
    else
      odd++;
  }
  for (int i = 0; i < adj[cur].size(); i++) {
    if (vis2[adj[cur][i]] == 0) {
      vis2[adj[cur][i]] = 1;
      tdfs(adj[cur][i], even, odd);
    }
  }
}
int main() {
  int n;
  cin >> n;
  adj.resize(n);
  vis.resize(n);
  vis2.resize(n);
  level.resize(n);
  for (int i = 0; i < n; i++) {
    level[i] = 0;
    vis[i] = 0;
    vis2[i] = 0;
  }
  for (int i = 0; i < n - 1; i++) {
    int t1, t2;
    cin >> t1 >> t2;
    adj[t1 - 1].push_back(t2 - 1);
    adj[t2 - 1].push_back(t1 - 1);
  }
  for (int i = 0; i < n; i++) {
    int t;
    cin >> t;
    a.push_back(t);
  }
  for (int i = 0; i < n; i++) {
    int t;
    cin >> t;
    b.push_back(t);
  }
  vis[0] = 1;
  dfs(0, 0);
  vis2[0] = 1;
  tdfs(0, 0, 0);
  cout << fa << endl;
  for (int i = 0; i < ans.size(); i++) cout << ans[i] << endl;
  return 0;
}
