Problem: 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.

Example

Input

5
1 2
1 3
3 4
3 5


Output

1 2 5 4 3

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;

vector<int> adj[200005];
int colour[200005];
void dfs(int u, int p){
	for(int v : adj[u]){
		if(v == p) continue;
		colour[v] = 3 - colour[u];
		dfs(v, u);
	}
}

int v[4];

int main(){
	//freopen("i.txt","r",stdin);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	int n; cin >> n;
	for(int i = 0;i < n-1;i++){
		int a, b; cin >> a >> b;
		a--; b--;
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	
	colour[0] = 1;
	dfs(0,-1);
	
	int one = 0, two = 0, three = 0;
	for(int i = 1;i <= n;i++){
		if(i % 3 == 1) one++;
		else if(i % 3 == 2) two++;
		else three++;
	}
	
	vector<int> O, T;
	for(int i = 0;i < n;i++){
		if(colour[i] == 1) O.push_back(i);
		else T.push_back(i);
	}
	
	if(O.size() >= one && T.size() >= two){
		while(O.size() > one){
			colour[O.back()] = 3;
			O.pop_back();
		}
		
		while(T.size() > two){
			colour[T.back()] = 3;
			T.pop_back();
		}
	}
	else if(O.size() < one){
		for(int i = 0;i < n;i++){
			if(colour[i] == 1) colour[i] = 3;
		}
		while(T.size() > two){
			if(one == 0) colour[T.back()] = 3;
			else colour[T.back()] = 1, one--;
			
			T.pop_back();
		}
	}
	else{
		for(int i = 0;i < n;i++){
			if(colour[i] == 2) colour[i] = 3;
		}
		while(O.size() > one){
			if(two == 0) colour[O.back()] = 3;
			else colour[O.back()] = 2, two--;
			
			O.pop_back();
		}
	}
	

	
	for(int i = 0;i < n;i++){
		cout << v[colour[i]] * 3 + colour[i] << " ";
		v[colour[i]]++;
	}
}