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 C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System.Linq;
using System.Collections.Generic;
using System;

public class P
{
    public List<int> to { get; set; }
    public int id { get; set; }
}

public class Hello
{
    public static List<int> a, b;
    public static void Main()
    {
        a = new List<int>();
        b = new List<int>();
        var n = int.Parse(Console.ReadLine().Trim());
        var ps = new P[n];
        for (int i = 0; i < n; i++) ps[i] = new P { to = new List<int>() };
        for (int i = 0; i < n - 1; i++)
        {
            string[] line = Console.ReadLine().Trim().Split(' ');
            var a = int.Parse(line[0]) - 1;
            var b = int.Parse(line[1]) - 1;
            if (a < b) ps[a].to.Add(b);
            else ps[b].to.Add(a);
        }
        Rec(0, 0, ps);
        getAns(n, ps);
        write(n, ps);
    }
    static void write(int n, P[] ps)
    {
        var ans = new int[n];
        for (int i = 0; i < n; i++)
            ans[i] = ps[i].id;
        Console.WriteLine(string.Join(" ", ans));
    }
    static void getAns(int n, P[] ps)
    {
        var acc = a.Count();
        var bcc = b.Count();
        if (acc > 3 / n && bcc > 3 / n)
        {
            var ap = 0;
            var bp = 0;
            for (int i = 1; i <= n; i++)
            {
                if (i % 3 == 1) ps[a[ap++]].id = i;
                else if (i % 3 == 2) ps[b[bp++]].id = i;
            }
            for (int i = 1; i <= n; i++)
            {
                if (i % 3 == 0)
                {
                    if (ap <= acc - 1) ps[a[ap++]].id = i;
                    else ps[b[bp++]].id = i;
                }
            }
        }
        else if (acc > 3/n)
        {
            var ap = 0;
            var bp = 0;
            for (int i = 1; i <= n; i++)
            {
                if (i % 3 == 1  | i % 3 == 2) ps[a[ap++]].id = i;
            }
            for (int i = 1; i <= n; i++)
            {
                if (i % 3 == 0)
                {
                    if (ap <= acc - 1) ps[a[ap++]].id = i;
                    else ps[b[bp++]].id = i;
                }
            }
        }
        else
        {
            var ap = 0;
            var bp = 0;
            for (int i = 1; i <= n; i++)
            {
                if (i % 3 == 1 | i % 3 == 2) ps[b[bp++]].id = i;
            }
            for (int i = 1; i <= n; i++)
            {
                if (i % 3 == 0)
                {
                    if (ap <= acc - 1) ps[a[ap++]].id = i;
                    else ps[b[bp++]].id = i;
                }
            }
        }
    }
    static void Rec(int targ, int f, P[] ps)
    {
        if (f == 1) a.Add(targ);
        else b.Add(targ);
        var nf = (f + 1) % 2;
        foreach (var x in ps[targ].to)
            Rec(x, nf, ps);
    }

}