Cod sursa(job #163483)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define pb push_back
const int MAX = 5010;
vector<int> v;
int ans[MAX];
int A[MAX][3];
int mx = 0,n,i;
int c,p;
bool comp(int x, int y) { // return x<y
if ( ans[x]==n+1 && ans[y]==n+1 )
if ( c==x )
ans[x] = p++;
else
ans[y] = p++;
if ( ans[x]==n+1 ) {
c = x;
} else {
if ( ans[y]==n+1 )
c = y;
}
return ans[x]<ans[y];
}
void qsort(vector<int> in, int d) {
mx = max(d, mx);
if ( in.size()<=0 )
return ;
vector<int> st, dr;
int piv, n=in.size(), i;
// choose piv
vector<int> p;
p.pb(in[A[n][0]]); p.pb(in[A[n][1]]); p.pb(in[A[n][2]]);
sort(p.begin(), p.end(), comp);
piv = p[1];
for (i=0; i<n; ++i) {
if ( in[i]==piv )
continue;
if ( comp(in[i],piv) )
st.pb(in[i]);
else
dr.pb(in[i]);
}
qsort(st,d+1);
qsort(dr,d+1);
in.clear();
int sts=st.size(), drs=dr.size();
for (i=0; i<sts; ++i)
in.pb(st[i]);
in.pb(piv);
for (i=0; i<drs; ++i)
in.pb(dr[i]);
}
int main() {
freopen("sortare.in" ,"r", stdin);
scanf("%d", &n);
for (i=2; i<=n; ++i) {
scanf("%d%d%d", A[i], A[i]+1, A[i]+2);
A[i][0]--; A[i][1]--; A[i][2]--;
}
for (i=0; i<n; ++i)
v.pb(i), ans[i] = n+1;
qsort(v,1);
freopen("sortare.out","w", stdout);
printf("%d\n", mx-1);
for (i=0; i<n; ++i)
printf("%d ", ans[i]+1);
return 0;
}