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: Wrong Answer)

from sys import stdin
from collections import deque

N = int(stdin.readline())
ab = [list(map(int, stdin.readline().split())) for i in range(N - 1)]

# 1 index
graph = [[] for i in range(N + 1)]
node_p = [0] * (N + 1)

for a, b in ab:
    graph[a].append(b)
    graph[b].append(a)

q = deque([])

mod0 = deque([])
mod1 = deque([])
mod2 = deque([])

for i in range(1, N + 1):
    if i % 3 == 0:
        mod0.append(i)
    elif i % 3 == 1:
        mod1.append(i)
    else:
        mod2.append(i)


def bfs(start):
    q.append([start, 0])
    dist = [-1] * (N + 1)

    if start == 1:
        node_p[start] = 1

    while q:
        now, prev = q.popleft()
        dist[now] = dist[prev] + 1

        if dist[now] > 3:
            return

        if dist[now] == 3:
            if node_p[now] == 0:
                modfit(now, start)
            elif (node_p[start] + node_p[now]) % 3 != 0:
                dummy2(-1)
                dummy()
            else:
                continue

        for nxt in graph[now]:
            if dist[nxt] == -1:
                q.append([nxt, now])


def modfit(now, start):
    if node_p[start] % 3 == 0:
        if mod1:
            node_p[now] = mod1.pop()
        elif mod2:
            node_p[now] = mod2.pop()
        elif mod0:
            node_p[now] = mod0.pop()

    elif node_p[start] % 3 == 1:
        if mod2:
            node_p[now] = mod2.pop()
        elif mod0:
            node_p[now] = mod0.pop()
        else:
            dummy2(-1)
            dummy()

    else:
        if mod1:
            node_p[now] = mod1.pop()
        elif mod0:
            node_p[now] = mod0.pop()
        else:
            dummy2(-1)
            dummy()


def dummy():
    return


def dummy2(n):
    return


for i in range(1, N + 1):
    bfs(i)

for i in range(1, N + 1):
    if node_p[i] == 0:
        if mod1:
            node_p[i] = mod1.pop()
        elif mod0:
            node_p[i] = mod0.pop()
        elif mod2:
            node_p[i] = mod2.pop()

for i in range(1, N + 1):
    print(node_p, end=" ")

print()