#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int inf = 0x7f7f7f7f;
const int maxn = 1e3 + 5;
int n, u, v, root, cnt[2], S;
vector<int> vec[maxn];
int sz[maxn], msz[maxn];
void dfs1(int x, int par) {
  for (int i = 0; i <= (int)vec[x].size() - 1; i++) {
    if (vec[x][i] == par) continue;
    dfs1(vec[x][i], x);
    sz[x] += sz[vec[x][i]];
    msz[x] = max(msz[x], sz[vec[x][i]]);
  }
  sz[x]++;
  msz[x] = max(msz[x], n - sz[x]);
}
int par[maxn];
int find(int x) {
  if (x == par[x]) return x;
  return par[x] = find(par[x]);
}
void dfs2(int x, int par, int f, int used) {
  for (int i = 0; i <= (int)vec[x].size() - 1; i++) {
    if (par == vec[x][i]) continue;
    int now = ++cnt[f] - used;
    dfs2(vec[x][i], x, f, now + used);
    if (f) now *= (S + 1);
    printf("%d %d %d\n", x, vec[x][i], now);
  }
}
int main() {
  cin >> n;
  if (n == 1) return 0;
  for (int i = 1; i <= n - 1; i++) {
    scanf("%d%d", &u, &v);
    vec[u].push_back(v);
    vec[v].push_back(u);
  }
  dfs1(1, -1);
  root = 1;
  for (int i = 1; i <= n; i++) {
    if (msz[i] < msz[root]) root = i;
  }
  memset(sz, 0, sizeof(sz));
  dfs1(root, -1);
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      que;
  for (int i = 0; i <= (int)vec[root].size() - 1; i++) {
    que.push(pair<int, int>(sz[vec[root][i]], vec[root][i]));
  }
  for (int i = 1; i <= n; i++) par[i] = i;
  while (que.size() >= 3) {
    pair<int, int> p1 = que.top();
    que.pop();
    pair<int, int> p2 = que.top();
    que.pop();
    par[p2.second] = find(p1.second);
    que.push(pair<int, int>(p1.first + p2.first, par[p1.second]));
  }
  for (int i = 1; i <= n; i++) find(i);
  int pp = par[vec[root][0]];
  for (int i = 0; i <= (int)vec[root].size() - 1; i++) {
    if (par[vec[root][i]] == pp) S += sz[vec[root][i]];
  }
  for (int i = 0; i <= (int)vec[root].size() - 1; i++) {
    if (par[vec[root][i]] == pp) {
      printf("%d %d %d\n", root, vec[root][i], ++cnt[0]);
      dfs2(vec[root][i], root, 0, cnt[0]);
    } else {
      printf("%d %d %d\n", root, vec[root][i], ++cnt[1] * (S + 1));
      dfs2(vec[root][i], root, 1, cnt[1]);
    }
  }
}
