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);
    }
}
template <typename T>
vector<T> Dijkstra(int s, vector<vector<pair<int, T>>> &g) {
    priority_queue<pair<T, int>, vector<pair<T, int>>, greater<pair<T, int>>>
        que;
    int n = sz(g);
    vector<T> d(n);
    rep(i, n) d[i] = LINF;
    d[s] = 0;
    que.push(make_pair(0LL, s));
    while (!que.empty()) {
        pair<T, int> p = que.top();
        que.pop();
        int v = p.second;
        if (d[v] < p.first) continue;
        for (auto e : g[v]) {
            if (chmin(d[e.first], d[v] + e.second)) {
                que.push(make_pair(d[e.first], e.first));
            }
        }
    }
    return d;
}
int main() {
    int n;
    cin >> n;

    g.resize(n);
    vector<vector<pair<int, ll>>> h(n);
    rep(i, n - 1) {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        g[a].push_back(b);
        g[b].push_back(a);
        h[a].emplace_back(b, 1ll);
        h[b].emplace_back(a, 1ll);
    }
    auto d1 = Dijkstra(0, h);
    int x;
    ll MAX = 0;
    rep(i, n) {
        if (chmax(MAX, d1[i])) x = i;
    }
    auto d2 = Dijkstra(x, h);
    MAX = 0;
    rep(i, n) {
        if (chmax(MAX, d2[i])) x = i;
    }

    dfs(x, -1, 0);
    sort(all(depth));

    vector<int> ans(n);
    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[idx] = 1;
                c1--;
            } else if (c0 > 0) {
                ans[idx] = 0;
                c0--;
            } else {
                ans[idx] = 2;
                c2--;
            }
        }
        if (dep % 2 == 1) {
            if (c2 > 0) {
                ans[idx] = 2;
                c2--;
            } else if (c0 > 0) {
                ans[idx] = 0;
                c0--;
            } else {
                ans[idx] = 1;
                c1--;
            }
        }
    }

    vector<int> v(n);

    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;
        }
        v[i] = ans[i];
    }

    sort(all(v));
    get_unique(v);
    assert(sz(v) == n && v[0] == 1 && v[n - 1] == n);

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