#include <bits/stdc++.h>
#include <cstdio>
#include <cassert>
using namespace std;
typedef long long ll;
#define MAX 500005
#define vll vector<ll>
#define pll pair<ll,ll>
#define S second
#define F first
vll v[MAX];
vector<int> rasta={};
ll band=0,subt=1,n,p[MAX],h[MAX],mx[3][MAX],a,b,c,tot;
ll dfs(ll x,ll y){
// cerr<<"\n"<<x<<" "<<y<<"\n";
h[x]=1;p[x]=y;
for(auto w : v[x]){
if(w!=y){
h[x]+=dfs(w,x);
mx[x][0]=h[w];
sort(mx[x],mx[x]+3);
}
}
if(h[x]<h[subt] && h[x]>=a)subt=x;
return h[x];
}
void dfs1(ll x,ll y,ll z){
if(tot>0){
rasta[x]=z;tot--;
for(auto w : v[x]){
if(w!=y){
dfs1(w,x,z);
}
}
}
}
vector<int> find_split(int _n, int _a, int _b, int _c, vector<int> p, vector<int> q) {
//rasta={0};
rasta.assign(_n,0);
pll ide[3]={{_a,1},{_b,2},{_c,3}};
sort(ide,ide+3);
n=_n;a=ide[0].F;b=ide[1].F;c=ide[2].F;
for(int i=0;i<p.size();i++){
v[p[i]].push_back(q[i]);
v[q[i]].push_back(p[i]);
}
dfs(0,0);
if(mx[0][p[subt]]>a || (mx[0][p[subt]]==a && mx[1][p[subt]]>=a)){
rasta.assign(n,(int)ide[2].S);
if(h[subt]>n-h[subt]){
tot=b;
dfs1(subt,p[subt],ide[1].S);
tot=a;
dfs1(p[subt],subt,ide[0].S);
}
else{
tot=a;
dfs1(subt,p[subt],ide[0].S);
tot=b;
dfs1(p[subt],subt,ide[1].S);
}
}
return rasta;
}