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 Java8 (OpenJDK 1.8.0) (judge verdict: Runtime Error)

package otherContest;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	public static int[] color;
	public static int red, blue;//red:1 blue:2
	public static To[] e;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] a = new int[n-1][2];
		e = new To[n];
		for (int i = 0; i < n; i++) e[i] = new To();
		for (int i = 0; i < n-1; i++) {
			a[i][0] = sc.nextInt()-1;
			a[i][1] = sc.nextInt()-1;
			e[a[i][0]].add(a[i][1]);
			e[a[i][1]].add(a[i][0]);
		}
		color = new int[n];
		red = 1; blue = 0;
		color[0] = 1;
		dfs(0);
		StringBuilder sb = new StringBuilder();
		int a1 = 1, a2 = 2, a3 = 3;
		if(red>n/3&&blue>n/3) {
			for (int i = 0; i < n; i++) {
				if(color[i]==1) {
					if(a1<=n) {
						sb.append(a1);
						a1 += 3;
					}else {
						sb.append(a3);
						a3 += 3;
					}
				}else if(color[i]==2) {
					if(a2<=n) {
						sb.append(a2);
						a2 += 3;
					}else {
						sb.append(a3);
						a3 += 3;
					}
				}
				sb.append(" ");
			}
		}else if(red < blue){
			for (int i = 0; i < n; i++) {
				if(color[i]==1) {
					sb.append(a3);
					a3 += 3;
				}else {
					if(a2<=n) {
						sb.append(a2);
						a2 += 3;
					}else {
						sb.append(a3);
						a3 += 3;
					}
				}
				sb.append(" ");
			}
		}else {
			for (int i = 0; i < n; i++) {
				if(color[i]==2) {
					sb.append(a3);
					a3 += 3;
				}else {
					if(a1<=n) {
						sb.append(a1);
						a1 += 3;
					}else {
						sb.append(a3);
						a3 += 3;
					}
				}
				sb.append(" ");
			}
		}
		System.out.println(new String(sb));
		sc.close();
	}
	public static void dfs(int x) {
		for (int i = 0; i < e[x].size(); i++) {
			if(color[e[x].get(i)]==0) {
				if(color[x]==1) {
					color[e[x].get(i)] = 2;
					blue++;
					dfs(e[x].get(i));
				}else if(color[x]==2) {
					color[e[x].get(i)] = 1;
					red++;
					dfs(e[x].get(i));
				}
			}
		}
		return;
	}
	public static class To{
		ArrayList<Integer> to;
		public To() {
			to = new ArrayList<Integer>();
		}
		public void add(Integer a) {
			to.add(a);
		}
		public int get(int i) {
			return to.get(i);
		}
		public int size() {
			return to.size();
		}
	}
}