#include <bits/stdc++.h>
using namespace std;
class DebugStream {
} LOG;
template <typename T>
DebugStream &operator<<(DebugStream &s, const T &) {
  return s;
}
mt19937 rnd(time(NULL));
const int maxN = 1e3 + 9, maxV = 1e6 + 9, MOD = 1e9 + 7, SQ = 335, lg = 20,
          bs = 29;
vector<int> adj[maxN];
long long ctr[2], sz[2];
int n, tams[maxN], marca[maxN], nume[maxN];
void prec(int nd, int an) {
  tams[nd] = 1;
  for (int sn : adj[nd])
    if (sn != an) {
      prec(sn, nd);
      tams[nd] += tams[sn];
    }
}
int getcent(int nd, int an) {
  for (int sn : adj[nd])
    if (sn != an && tams[sn] * 2 > n) return getcent(sn, nd);
  return nd;
}
void dfs(int nd, int an, int mrkk) {
  for (int sn : adj[nd]) {
    if (sn == an) continue;
    nume[sn] = ++ctr[mrkk];
    dfs(sn, nd, mrkk);
  }
  long long vlue = nume[nd] - nume[an];
  if (mrkk == 1) vlue *= sz[0] + 1;
  cout << nd + 1 << ' ' << an + 1 << ' ' << vlue << '\n';
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1, u, v; i < n; i++) {
    cin >> u >> v, u--, v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  prec(0, -1);
  int cent = getcent(0, -1);
  prec(cent, -1);
  sort(adj[cent].begin(), adj[cent].end(),
       [&](int a, int b) { return tams[a] > tams[b]; });
  for (int sn : adj[cent])
    if (sz[0] > sz[1])
      marca[sn] = 1, sz[1] += tams[sn];
    else
      sz[0] += tams[sn];
  LOG << cent + 1 << '\n';
  for (int sn : adj[cent]) {
    nume[sn] = ++ctr[marca[sn]];
    dfs(sn, cent, marca[sn]);
  }
}
