#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define NMAX 5005
int V[NMAX], N, Piv[NMAX][3], T[NMAX], Hmax, H2;
void read()
{
int i, j, k, aux;
scanf("%d", &N);
for (i = 2; i <= N; i++)
{
scanf("%d%d%d", &Piv[i][0], &Piv[i][1], &Piv[i][2]);
for (j = 0; j < 3; j++)
for (k = j+1; k < 3; k++)
if (Piv[i][j]>Piv[i][k])
aux = Piv[i][j], Piv[i][j] = Piv[i][k], Piv[i][k] = aux;
}
}
void solve(int p, int q, int l, int lev)
{
int x;
if (Hmax<lev) Hmax = lev;
if (l==1) {
V[p] = p; return; }
x = p+Piv[l][1]-1;
V[x] = x;
solve(p,x-1,x-p,lev+1);
solve(x+1,q,x-p,lev+1);
}
int st[NMAX], dr[NMAX], stiva[NMAX][2];
void sort(int v[NMAX], int n, int lev)
{
int piv, i, l = 0, r = 0, j, k, aux;
int x[3];
if (lev>H2) H2 = lev;
if (n<=1) return;
x[0] = v[ Piv[n][0] ];
x[1] = v[ Piv[n][1] ];
x[2] = v[ Piv[n][2] ];
for (j = 0; j < 3; j++)
for (k = j+1; k < 3; k++)
if (x[j]>x[k])
aux = x[j], x[j] = x[k], x[k] = aux;
piv = x[1];
stiva[lev][0] = stiva[lev][1] = 0;
for (i = 1; i <= n; i++)
if (v[i]<piv) st[++stiva[lev][0]] = v[i];
else
if (v[i]>piv) dr[++stiva[lev][1]] = v[i];
sort(st,stiva[lev][0],lev+1);
sort(dr,stiva[lev][1],lev+1);
}
void bulan()
{
int cnt = N, i, j, max, x, v[NMAX], mark[NMAX];
if (cnt>2000) cnt = 2000;
srand(time(0));
while (cnt>0)
{
cnt--;
memset(mark,0,sizeof(mark));
memset(v,0,sizeof(v));
memset(st,0,sizeof(st));
memset(dr,0,sizeof(dr));
for (i = 1; i <= N; i++)
{
x = 1+rand()%N;
while (mark[x]) x = 1+rand()%N;
v[i] = x;
mark[x] = 1;
}
sort(v,N,1);
if (H2>max) {
max = H2;
for (j = 1; j <= N; j++) T[j] = v[j]; }
}
if (max>Hmax)
{
Hmax = max;
for (i = 1; i <= N; i++) V[i] = T[i];
}
}
void write()
{
int i;
printf("%d\n", Hmax);
for (i = 1; i <= N; i++) printf("%d ", V[i]);
printf("\n");
}
int main()
{
freopen("sortare.in", "r", stdin);
freopen("sortare.out", "w", stdout);
read();
solve(1,N,N,1);
if (N<501) bulan();
write();
return 0;
}