Problem:
Score : 600 points

Problem Statement

We have a tree with N vertices. The vertices are numbered 1 to N, and the i-th edge connects Vertex a_i and Vertex b_i.

Takahashi loves the number 3. He is seeking a permutation p_1, p_2, \ldots , p_N of integers from 1 to N satisfying the following condition:

For every pair of vertices (i, j), if the distance between Vertex i and Vertex j is 3, the sum or product of p_i and p_j is a multiple of 3.

Here the distance between Vertex i and Vertex j is the number of edges contained in the shortest path from Vertex i to Vertex j.

Help Takahashi by finding a permutation that satisfies the condition.

Constraints

2\leq N\leq 2\times 10^5

1\leq a_i, b_i \leq N

The given graph is a tree.

Input

Input is given from Standard Input in the following format:

N
a_1 b_1
a_2 b_2
\vdots
a_{N-1} b_{N-1}

Output

If no permutation satisfies the condition, print -1.

Otherwise, print a permutation satisfying the condition, with space in between.
If there are multiple solutions, you can print any of them.

Sample Input 1

5
1 2
1 3
3 4
3 5

Sample Output 1

1 2 5 4 3

The distance between two vertices is 3 for the two pairs (2, 4) and (2, 5).

p_2 + p_4 = 6

p_2\times p_5 = 6

Thus, this permutation satisfies the condition.

Solution in PyPy3 (2.4.0) (judge verdict: Runtime Error)

from collections import deque


def bfs(si):
    q = deque()
    used = set()
    q.append([si, 0])
    used.add(si)

    while len(q) > 0:
        prvi, d = q.popleft()
        if d < 2:
            for i in g[prvi]:
                if i not in used:
                    q.append([i, d + 1])
                    used.add(i)

        elif d == 2:
            for i in g[prvi]:
                if i not in used:
                    if max(si, i) not in dis3_pairs[min(si, i)]:
                        dis3_pairs[min(si, i)].add(max(si, i))

                    used.add(i)


N = int(input())
g = {i: [] for i in range(1, N + 1)}

for _ in range(N - 1):
    a, b = map(int, input().split())
    g[a].append(b)
    g[b].append(a)

dis3_pairs = {i: set() for i in range(1, N + 1)}
for n in range(1, N + 1):
    bfs(n)

sorted_dis3_pairs = sorted(dis3_pairs.items(), key=lambda x: len(x[1]), reverse=True)

mod3_0 = deque()
mod3_1 = deque()
mod3_2 = deque()
for i in range(1, N + 1):
    if i % 3 == 0:
        mod3_0.append(i)
    elif i % 3 == 1:
        mod3_1.append(i)
    else:
        mod3_2.append(i)

ans = [-1 for _ in range(N)]
for par_node, chi_nodes in sorted_dis3_pairs:
    if len(chi_nodes) == 0:
        continue

    if len(mod3_0) > 0:
        tmp_num1 = mod3_0.pop()
        ans[par_node - 1] = tmp_num1
    else:
        if len(mod3_1) > len(mod3_2):
            for_par_node = mod3_2
            for_chi_node = mod3_1
        else:
            for_par_node = mod3_1
            for_chi_node = mod3_2

        tmp_num1 = for_par_node.pop()
        ans[par_node - 1] = tmp_num1
        for chi_node in chi_nodes:
            tmp_num2 = for_chi_node.pop()
            ans[chi_node - 1] = tmp_num2

for i in range(N):
    if ans[i] == -1:
        if len(mod3_0) > 0:
            ans[i] = mod3_0.pop()
        elif len(mod3_1) > 0:
            ans[i] = mod3_1.pop()
        else:
            ans[i] = mod3_2.pop()

print(*ans)