#include <bits/stdc++.h>
const int mod = 1e9 + 7;
using namespace std;
int main() {
  ios_base::sync_with_stdio(0);
  long long n;
  cin >> n;
  vector<vector<long long>> graph(n + 1);
  for (long long i = 1; i < n; i++) {
    long long x, y;
    cin >> x >> y;
    graph[x].push_back(y);
    graph[y].push_back(x);
  }
  vector<long long> _int(n + 1);
  vector<long long> value(n + 1);
  for (long long i = 1; i <= n; i++) cin >> _int[i];
  for (long long j = 1; j <= n; j++) cin >> value[j];
  queue<pair<long long, long long>> q;
  q.push({1, 0});
  vector<long long> sum(n + 1);
  vector<bool> flag(n + 1);
  vector<long long> finalans;
  if (_int[1] != value[1]) {
    finalans.push_back(1);
    sum[1] = 1;
  }
  flag[1] = true;
  while (!q.empty()) {
    pair<long long, long long> d = q.front();
    q.pop();
    for (long long i = 0; i < graph[d.first].size(); i++) {
      if (!flag[graph[d.first][i]]) {
        flag[graph[d.first][i]] = true;
        sum[graph[d.first][i]] = sum[d.second];
        long long node = graph[d.first][i];
        if (sum[graph[d.first][i]] % 2 == 0 && _int[node] != value[node]) {
          sum[node]++;
          finalans.push_back(node);
        } else if (sum[node] % 2 == 1 && _int[node] == value[node]) {
          sum[node]++;
          finalans.push_back(node);
        }
        q.push(make_pair(graph[d.first][i], d.first));
      }
    }
  }
  cout << finalans.size() << endl;
  for (auto it = (finalans).begin(); it != (finalans).end(); it++)
    cout << *it << " ";
  return 0;
}
