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;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define all(x) (x).begin(), (x).end()
#define sz(x) int(x.size())
#define get_unique(x) x.erase(unique(all(x)), x.end());
typedef long long ll;
typedef complex<double> Complex;
const int INF = 1e9;
const ll MOD = 1e9 + 7;
const ll LINF = 1e18;
template <class T>
bool chmax(T &a, const T &b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
    if (b < a) {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
vector<T> make_vec(size_t a) {
    return vector<T>(a);
}
template <class T, class... Ts>
auto make_vec(size_t a, Ts... ts) {
    return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}

vector<vector<int>> g;
vector<pair<int, int>> depth;
void dfs(int now, int pre, int dep) {
    depth.emplace_back(dep, now);
    for (int nxt : g[now]) {
        if (nxt == pre) continue;
        dfs(nxt, now, dep + 1);
    }
}

int main() {
    int n;
    cin >> n;

    g.resize(n);
    rep(i, n - 1) {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs(0, -1, 0);
    sort(all(depth));

    vector<int> ans(n);
    int pos = 0, pre;
    int c1 = n / 3 + (n % 3 >= 1), c2 = n / 3 + (n % 3 >= 2), c0 = n / 3;
    assert(c1 + c2 + c0 == n);
    rep(i, n) {
        int dep, idx;
        tie(dep, idx) = depth[i];
        if (dep % 2 == 0) {
            if (c1 > 0) {
                ans[i] = 1;
                c1--;
            } else {
                ans[i] = 0;
                c0--;
            }
        }
        if (dep % 2 == 1) {
            if (c2 > 0) {
                ans[i] = 2;
                c2--;
            } else {
                ans[i] = 0;
                c0--;
            }
        }
    }

    int n0 = 3, n1 = 1, n2 = 2;
    rep(i, n) {
        if (ans[i] == 0) {
            ans[i] = n0;
            n0 += 3;
        } else if (ans[i] == 1) {
            ans[i] = n1;
            n1 += 3;
        } else if (ans[i] == 2) {
            ans[i] = n2;
            n2 += 3;
        }
    }

    rep(i, n) cout << ans[i] << " \n"[i == n - 1];
}