#include <bits/stdc++.h>
#define LL long long
#define mem(i, j) memset(i, j, sizeof(i))
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
#define make make_pair
#define INF INT_MAX
#define inf LLONG_MAX
#define PI acos(-1)
#define fir first
#define sec second
using namespace std;

const int N = 2e5 + 5;

int ans[N];
vector < int > G[N];
vector < int > Q[2];
vector < int > P[3];

void dfs(int u, int fa, int op) {
    Q[op].pb(u);
    for(auto v : G[u]) {
        if(v == fa) continue;
        dfs(v, u, op ^ 1);
    }
}

void add(int op1, int op2) {
    while(!Q[op1].empty() && !P[op2].empty()) {
        ans[Q[op1].back()] = P[op2].back();
        Q[op1].pop_back();
        P[op2].pop_back();
    }
}

void solve() {

    int n;
    scanf("%d", &n);
    rep(i, 1, n) P[i % 3].pb(i);
    rep(i, 1, n - 1) {
        int u, v;
        scanf("%d %d", &u, &v);
        G[u].pb(v);
        G[v].pb(u);
    }
    dfs(1, 0, 0);

    if(Q[0].size() > Q[1].size()) add(0, 1);
    else add(1, 1);

    if(Q[0].size() > Q[1].size()) add(0, 2);
    else add(1, 2);

    add(0, 0);
    add(1, 0);

    rep(i, 1, n) printf("%d ", ans[i]); puts("");
}


int main() {
//    int _; scanf("%d", &_);
//    while(_--) solve();

    solve();

    return 0;
}
