#include <fstream>
#include <iostream>
using namespace std;
ifstream in ("sortare.in");
ofstream out ("sortare.out");
const int max_size = 5e3 + 1, max_aint = 20e3 + 1;
int a[max_size], b[max_size], c[max_size], p[max_size], ans, nr, n, aint[max_aint];
void init (int l, int r, int nod)
{
if (l == r)
{
aint[nod] = 1;
}
else
{
int m = (l + r) / 2;
init(l, m, 2 * nod);
init(m + 1, r, 2 * nod + 1);
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
}
void querry (int l, int r, int poz, int val, int nod)
{
cout << l << " " << r << '\n';
if (l == r)
{
p[l] = val;
aint[nod] = 0;
return;
}
int m = (l + r) / 2;
if (poz <= aint[2 * nod])
{
querry(l, m, poz, val, 2 * nod);
}
else
{
querry(m + 1, r, poz - aint[2 * nod], val, 2 * nod + 1);
}
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
void qs (int x)
{
if (x == 0)
{
return;
}
ans++;
if (x == 1)
{
querry(1, n, 1, nr, 1);
return;
}
if (a[x] == b[x] || a[x] == c[x] || b[x] == c[x])
{
if (a[x] == b[x] || a[x] == c[x])
{
querry(1, n, a[x], nr, 1);
}
else
{
querry(1, n, b[x], nr, 1);
}
nr++;
qs(x - 1);
}
else
{
querry(1, n, max(a[x], b[x]), nr, 1);
nr++;
cout << "*";
querry(1, n, min(a[x], b[x]), nr, 1);
nr++;
qs(x - 2);
}
}
int main ()
{
nr = 1;
in >> n;
init(1, n, 1);
for (int i = 2; i <= n; i++)
{
in >> a[i] >> b[i] >> c[i];
}
qs(n);
out << ans << '\n';
for (int i = 1; i <= n; i++)
{
out << p[i] << " ";
}
in.close();
out.close();
return 0;
}