Iahub is very proud of his recent discovery, propagating trees. Right now, he invented a new tree, called xor-tree. After this new revolutionary discovery, he invented a game for kids which uses xor-trees.

The game is played on a tree having n nodes, numbered from 1 to n. Each node i has an initial value init_{i}, which is either 0 or 1. The root of the tree is node 1.

One can perform several (possibly, zero) operations on the tree during the game. The only available type of operation is to pick a node x. Right after someone has picked node x, the value of node x flips, the values of sons of x remain the same, the values of sons of sons of x flips, the values of sons of sons of sons of x remain the same and so on.

The goal of the game is to get each node i to have value goal_{i}, which can also be only 0 or 1. You need to reach the goal of the game by using minimum number of operations.


-----Input-----

The first line contains an integer n (1 ≤ n ≤ 10^5). Each of the next n - 1 lines contains two integers u_{i} and v_{i} (1 ≤ u_{i}, v_{i} ≤ n; u_{i} ≠ v_{i}) meaning there is an edge between nodes u_{i} and v_{i}. 

The next line contains n integer numbers, the i-th of them corresponds to init_{i} (init_{i} is either 0 or 1). The following line also contains n integer numbers, the i-th number corresponds to goal_{i} (goal_{i} is either 0 or 1).


-----Output-----

In the first line output an integer number cnt, representing the minimal number of operations you perform. Each of the next cnt lines should contain an integer x_{i}, representing that you pick a node x_{i}.


-----Examples-----
Input
10
2 1
3 1
4 2
5 1
6 2
7 5
8 6
9 8
10 5
1 0 1 1 0 1 0 1 0 1
1 0 1 0 0 1 1 1 0 1

Output
2
4
7

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

ns = {"__name__": "__main__"}
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = "'''input\n10\n2 1\n3 1\n4 2\n5 1\n6 2\n7 5\n8 6\n9 8\n10 5\n1 0 1 1 0 1 0 1 0 1\n1 0 1 0 0 1 1 1 0 1\n'''\n\nfrom sys import stdin, setrecursionlimit\nfrom collections import defaultdict\nsetrecursionlimit(1500000)\n\n\ndef counter(num):\n\tif num == 0:\n\t\treturn 1\n\telse:\n\t\treturn 0\n\n\ndef flip_me(original, count, index):\n\tif count % 2 == 0:\n\t\treturn original[index]\n\telse:\n\t\treturn counter(original[index])\n\n\ndef dfs(graph, visited, ans, original, goal, change, node, dfs_stack):\n\tdfs_stack.append(node)\n\twhile len(dfs_stack) > 0:\n\t\tnode = dfs_stack.pop()\n\t\tvisited[node] = True\n\t\t\n\t\tvalue = flip_me(original, change[node], node - 1)\n\t\tadd = 0\n\t\tif goal[node - 1] == value:\n\t\t\tpass\n\t\telse:\n\t\t\tadd = 1\n\t\t\tans[node] = True\n\t\t\t\n\n\t\tflag = 0\n\t\tfor i in  graph[node]:\n\t\t\t\tif visited[i] == False:\n\t\t\t\t\tflag = 1\n\t\t\t\t\tfor j in graph[i]:\n\t\t\t\t\t\tif visited[j] == False:\n\t\t\t\t\t\t\tchange[j] += change[node] + add\n\n\t\t\t\t\tdfs_stack.append(node)\n\t\t\t\t\tdfs_stack.append(i)\n\t\t\t\t\tbreak\n\n\t\tif flag == 0:\n\t\t\tpass\n\ndef calculate(graph, original, goal, n):\n\tvisited = dict()\n\tchange = dict()\n\tfor i in range(1, n + 1):\n\t\tvisited[i] = False\n\t\tchange[i] = 0\n\tans = dict()\n\tdfs_stack = []\n\tdfs(graph, visited, ans, original, goal, change, 1, dfs_stack)\n\treturn ans\n\n# main starts \nn = int(stdin.readline().strip())\ngraph = defaultdict(list)\nfor i in range(1, n + 1):\n\tgraph[i]\n\nfor _ in range(n - 1):\n\tu, v = list(map(int, stdin.readline().split()))\n\tgraph[u].append(v)\n\tgraph[v].append(u)\n\noriginal = list(map(int, stdin.readline().split()))\ngoal = list(map(int, stdin.readline().split()))\ncount = [0]\nans = calculate(graph, original, goal, n)\nprint(len(ans))\nfor i in ans:\n\tprint(i)"
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

```

Measured memory_bytes: 14755