#include <bits/stdc++.h>
using namespace std;
#define REP(i, n) FOR(i, 0, (n))
#define FOR(i, a, b) for(int i=(a); i<(b); i++)
#define LAR(a, b) ((a)=max((a),(b)))
#define SML(a, b) ((a)=min((a),(b)))
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vl = vector<ll>;
using pii = pair<int, int>;
using vpii = vector<pair<int, int>>;
template<typename T>
using pque = priority_queue<T, vector<T>, greater<T>>;
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define ALL(a) (a).begin(), (a).end()
#ifdef LOCAL_DEBUG
#define DEBUG(...) printf(__VA_ARGS__)
#else
#define DEBUG(...)
#endif

#define N 212345
int n;
vi g[N];
set<int> a[2];
int ans[N];

void dfs(int i, int p, int d){
	a[d%2].emplace(i);
	for(int &j : g[i]){
		if(j == p) continue;
		dfs(j, i, d+1);
	}
}
int f(int x){
	REP(i, 2) if((int)a[i].size() >= x) return i;
	assert(false);
}
void h(int p, int i){
	auto it = a[p].begin();
	ans[*it] = i;
	a[p].erase(it);
}
void gg(int k){
	int cnt, p;
	cnt = 0;
	for(int i = k; i <= n; i += 3) cnt++;
	p = f(cnt);
	for(int i = k; i <= n; i += 3) {
		h(p, i);
	}
}

int main(){
	scanf("%d", &n);
	REP(i, n-1){
		int a, b; scanf("%d%d", &a, &b);
		g[a].EB(b);
		g[b].EB(a);
	}
	dfs(1, 0, 0);

	gg(1);
	gg(2);

	for(int i = 3; i <= n; i += 3){
		h(f(1), i);
	}

	for(int i = 1; i <= n; i++) printf("%d ", ans[i]);
}



