#include <bits/stdc++.h>   long long dx[8] = {0, 1, 0, -1, 1, 1, -1, -1};   long long dy[8] = {1, 0, -1, 0, -1, 1, 1, -1};   using namespace std;   class pa3 {    public:     long long x;     long long y, z;     pa3(long long x = 0, long long y = 0, long long z = 0) : x(x), y(y), z(z) {}     bool operator<(const pa3 &p) const {       if (x != p.x) return x < p.x;       if (y != p.y) return y < p.y;       return z < p.z;     }     bool operator>(const pa3 &p) const {       if (x != p.x) return x > p.x;       if (y != p.y) return y > p.y;       return z > p.z;     }     bool operator==(const pa3 &p) const {       return x == p.x && y == p.y && z == p.z;     }     bool operator!=(const pa3 &p) const {       return !(x == p.x && y == p.y && z == p.z);     }   };   class pa4 {    public:     long long x;     long long y, z, w;     pa4(long long x = 0, long long y = 0, long long z = 0, long long w = 0)         : x(x), y(y), z(z), w(w) {}     bool operator<(const pa4 &p) const {       if (x != p.x) return x < p.x;       if (y != p.y) return y < p.y;       if (z != p.z) return z < p.z;       return w < p.w;     }     bool operator>(const pa4 &p) const {       if (x != p.x) return x > p.x;       if (y != p.y) return y > p.y;       if (z != p.z) return z > p.z;       return w > p.w;     }     bool operator==(const pa4 &p) const {       return x == p.x && y == p.y && z == p.z && w == p.w;     }   };   class pa2 {    public:     long long x, y;     pa2(long long x = 0, long long y = 0) : x(x), y(y) {}     pa2 operator+(pa2 p) { return pa2(x + p.x, y + p.y); }     pa2 operator-(pa2 p) { return pa2(x - p.x, y - p.y); }     bool operator<(const pa2 &p) const { return y != p.y ? y < p.y : x < p.x; }     bool operator>(const pa2 &p) const { return x != p.x ? x < p.x : y < p.y; }     bool operator==(const pa2 &p) const {       return abs(x - p.x) == 0 && abs(y - p.y) == 0;     }     bool operator!=(const pa2 &p) const {       return !(abs(x - p.x) == 0 && abs(y - p.y) == 0);     }   };   string itos(long long i) {     ostringstream s;     s << i;     return s.str();   }   long long gcd(long long v, long long b) {     if (v > b) return gcd(b, v);     if (v == b) return b;     if (b % v == 0) return v;     return gcd(v, b % v);   }   long long mod;   long long extgcd(long long a, long long b, long long &x, long long &y) {     if (b == 0) {       x = 1;       y = 0;       return a;     }     long long d = extgcd(b, a % b, y, x);     y -= a / b * x;     return d;   }   pair<long long, long long> operator+(const pair<long long, long long> &l,                                        const pair<long long, long long> &r) {     return {l.first + r.first, l.second + r.second};   }   pair<long long, long long> operator-(const pair<long long, long long> &l,                                        const pair<long long, long long> &r) {     return {l.first - r.first, l.second - r.second};   }   long long pr[1000010];   long long inv[1000010];   long long beki(long long wa, long long rr, long long warukazu) {     if (rr == 0) return 1 % warukazu;     if (rr == 1) return wa % warukazu;     wa %= warukazu;     if (rr % 2 == 1)       return ((long long)beki(wa, rr - 1, warukazu) * (long long)wa) % warukazu;     long long zx = beki(wa, rr / 2, warukazu);     return (zx * zx) % warukazu;   }   long long comb(long long nn, long long rr) {     if (rr < 0 || rr > nn || nn < 0) return 0;     long long r = pr[nn] * inv[rr];     r %= mod;     r *= inv[nn - rr];     r %= mod;     return r;   }   void gya(long long ert) {     pr[0] = 1;     for (long long i = 1; i <= ert; i++) {       pr[i] = (pr[i - 1] * i) % mod;     }     inv[ert] = beki(pr[ert], mod - 2, mod);     for (long long i = ert - 1; i >= 0; i--) {       inv[i] = inv[i + 1] * (i + 1) % mod;     }   }   long long sita[1010];   long long oya[1010];   vector<long long> G[1010], H1[1010], H2[1010];   long long dfs1(long long r, long long p) {     oya[r] = p;     sita[r] = 1;     for (auto v : G[r])       if (v != p) {         sita[r] += dfs1(v, r);       }     return sita[r];   }   long long dep[1011];   void dfs2(long long r, long long p, long long d = 1) {     oya[r] = p;     dep[r] = d;     for (auto v : G[r])       if (v != p) {         dfs2(v, r, d + 1);         H1[r].push_back(v);       }   }   void dfs3(long long r, long long p, long long d = 1) {     oya[r] = p;     dep[r] = d;     for (auto v : G[r])       if (v != p) {         dfs3(v, r, d + 1);         H2[r].push_back(v);       }   }   long long dp[1010][1010];   long long mae[1010][1011];   long long wei[1010];   signed main() {     cin.tie(0);     ios::sync_with_stdio(false);     long long n;     cin >> n;     for (long long i = 0; i < n - 1; i++) {       long long y, yy;       cin >> y >> yy;       G[y].push_back(yy);       G[yy].push_back(y);     }     if (n == 1) {       return 0;     }     if (n == 2) {       cout <<  1 2 1  << endl;       return 0;     }     dfs1(1, 1);     long long root = -1;     for (long long i = 2; i <= n; i++) {       long long wa = n - 1;       bool ok = true;       for (auto v : G[i])         if (v != oya[i]) {           if (!(sita[v] <= n / 2)) ok = 0;           wa -= sita[v];         }       if (!ok) continue;       if (wa <= n / 2) root = i;     }     if (root == -1) root = 1;     dfs1(root, root);     vector<pair<long long, long long> > ve;     for (auto v : G[root]) ve.push_back({v, sita[v]});     long long m = ve.size();     dp[0][0] = 1;     mae[0][0] = -1;     for (long long i = 0; i < m; i++) {       for (long long j = 0; j <= n; j++)         if (dp[i][j]) {           dp[i + 1][j] = 1;           mae[i + 1][j] = mae[i][j];           dp[i + 1][j + ve[i].second] = 1;           mae[i + 1][j + ve[i].second] = i;         }     }     vector<long long> V1, V2;     for (long long j = n / 2; j >= 0; j--)       if (dp[m][j]) {         long long imaval = j;         long long imaind = m;         while (1) {           V1.push_back(ve[mae[imaind][imaval]].first);           long long ee = imaval;           imaval -= ve[mae[imaind][imaval]].second;           imaind = mae[imaind][ee];           if (mae[imaind][imaval] == -1) break;         }         break;       }     for (auto v : ve) {       bool bo = 0;       for (auto w : V1)         if (v.first == w) {           bo = 1;           break;         }       if (!bo) V2.push_back(v.first);     }     for (auto v : V1) dfs2(v, root), H1[root].push_back(v);     for (auto v : V2) dfs3(v, root), H2[root].push_back(v);     long long h1 = 0, h2 = 0;     for (long long i = 1; i <= n; i++) h1 += H1[i].size();     for (long long i = 1; i <= n; i++) h2 += H2[i].size();     assert(h1 + h2 == n - 1);     ve.clear();     for (long long i = 1; i <= n; i++)       for (auto v : H1[i]) ve.push_back({dep[v], v});     sort(ve.begin(), ve.end());     for (long long i = 0; i < ve.size(); i++) {       wei[ve[i].second] = (i + 1) * (h2 + 1);     }     ve.clear();     for (long long i = 1; i <= n; i++)       for (auto v : H2[i]) ve.push_back({dep[v], v});     sort(ve.begin(), ve.end());     for (long long i = 0; i < ve.size(); i++) {       wei[ve[i].second] = i + 1;     }     for (long long i = 1; i <= n; i++)       if (i != root) {         cout << i <<     << oya[i] <<     << wei[i] - wei[oya[i]] << endl;       }     for (long long i = 1; i <= n; i++)       if (i != root) {       }     return 0;   }