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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,ll>pii;
typedef vector<int>vi;

#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define fi first
#define se second
#define de(x) cout<<#x<<"="<<x<<"\n"
#define dd(x) cout<<#x<<"="<<x<<" "
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
#define lowbit(a) ((a)&-(a))
#define per(i,a,b) for(int i=(b)-1;i>=(a);--i)
const int N=4e5+5;
int n;
vi g[N],s[N];
int mx = 0;
void dfs(int u,int p,int h){
	s[h].pb(u);
	mx = max(mx,h);
	for(auto v:g[u]){
		if(v == p)continue;
		dfs(v,u,h + 1);
	}
}
int ans[N];
vi t[5];
bool vis[N]; 
int main()
{
	cin>>n;
	int u,v;
	rep(i , 1 , n){
		cin>>u>>v;
		g[u].pb(v);
		g[v].pb(u);
	}
	rep(i , 1 , n + 1)
		t[i%3].pb(i);
	dfs(1,0,1);
	int ev = 0,odd = 0;
	rep(i , 1 ,n + 1)
		if(i&1)odd += sz(s[i]);
		else ev += sz(s[i]);
	if(odd < ev){
		swap(odd,ev);
		for(int i = 2;i <= mx;i += 2){
			swap(s[i],s[i - 1]);
		}
	}


	if(ev <= sz(t[0])){
		rep(i , 1 , n + 1){
			if(i&1){
				for(auto v:s[i]){
					if(sz(t[1]))ans[v] = t[1].back(),t[1].pop_back();
					else if(sz(t[0]))ans[v] = t[0].back(),t[0].pop_back();
					else if(sz(t[2]))ans[v] = t[2].back(),t[2].pop_back();
				}
			}
			else{
				for(auto v:s[i]){
					if(sz(t[0]))ans[v] = t[0].back(),t[0].pop_back();
				}
			}
		}
		
	}
	else {
		rep(i , 1 , n + 1){
			if(i&1){
				for(auto v:s[i]){
					if(sz(t[1]))ans[v] = t[1].back(),t[1].pop_back();
					else if(sz(t[0]))ans[v] = t[0].back(),t[0].pop_back();
					else if(sz(t[2]))ans[v] = t[2].back(),t[2].pop_back();
				}
			}
			else{
				for(auto v:s[i]){
					if(sz(t[2]))ans[v] = t[2].back(),t[2].pop_back();
					else if(sz(t[0]))ans[v] = t[0].back(),t[0].pop_back();
					else if(sz(t[1]))ans[v] = t[1].back(),t[1].pop_back();
				}
			}
		}
	}
	rep(i , 1 , n + 1)cout<<ans[i]<<" ";
	return 0;
}