#include <bits/stdc++.h>
using namespace std;
class Solution {
 private:
  int v;
  int result;
  vector<int>* tree;
  vector<int> changedNodes;
  int initial[200000];
  int target[200000];
  bool vis[200000];

 public:
  Solution(int v) {
    memset(vis, 0, sizeof(vis));
    memset(target, 0, sizeof(initial));
    memset(initial, 0, sizeof(target));
    this->v = v;
    tree = new vector<int>[v];
    takeInputs();
    Solve(0, 0, 0, 0);
    cout << result;
    for (int i = 0; i < changedNodes.size(); i++)
      cout << endl << changedNodes[i] + 1;
  }
  void addEdge(int u, int v) {
    tree[u].push_back(v);
    tree[v].push_back(u);
  }
  void takeInputs() {
    for (int i = 0; i < v - 1; i++) {
      int x, y;
      cin >> x >> y;
      addEdge(x - 1, y - 1);
    }
    for (int i = 0; i < v; i++) cin >> initial[i];
    for (int i = 0; i < v; i++) cin >> target[i];
  }
  void Solve(int node, int level, int even, int odd) {
    if (vis[node]) return;
    vis[node] = 1;
    int* changes;
    if (level & 1)
      changes = &odd;
    else
      changes = &even;
    int realValue = initial[node] ^ (*changes & 1);
    if (realValue != target[node])
      result++, changedNodes.push_back(node), (*changes)++;
    for (int i = 0; i < tree[node].size(); i++)
      Solve(tree[node][i], level + 1, even, odd);
  }
};
int main() {
  int size;
  cin >> size;
  Solution S(size);
  return 0;
}
