#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
struct edge {
  int to, next;
} e[N * 2];
int head[N], tot, n;
int sz[N], mxv, mxrt;
void add(int x, int y) {
  e[++tot] = (edge){y, head[x]};
  head[x] = tot;
}
void dfs(int x, int fa, int n) {
  int mx = 0;
  sz[x] = 1;
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to != fa) {
      dfs(e[i].to, x, n);
      sz[x] += sz[e[i].to];
      mx = max(mx, sz[e[i].to]);
    }
  mx = max(mx, n - sz[x]);
  if (mx < mxv) mxv = mx, mxrt = x;
}
pair<int, int> q[N];
int f[N][N];
int top, be[N], mnv, mnid, dif;
void insert(int x, int y) {
  q[++top] = pair<int, int>(x, y);
  for (int i = (int)(0); i <= (int)(n); i++) f[top][i] = f[top - 1][i];
  for (int i = (int)(y); i <= (int)(n); i++) f[top][i] |= f[top - 1][i - y];
}
int s1, s2, dep[N];
void getans(int x, int fa, int type) {
  dep[x] = (type == 1 ? (s1 += 1) : (s2 += dif));
  printf("%d %d %d\n", x, fa, dep[x] - dep[fa]);
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to != fa) getans(e[i].to, x, type);
}
int main() {
  scanf("%d", &n);
  for (int i = (int)(1); i <= (int)(n - 1); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
  }
  mxv = 1 << 30;
  dfs(1, 0, n);
  f[0][0] = 1;
  for (int i = head[mxrt]; i; i = e[i].next)
    insert(e[i].to, sz[e[i].to] > sz[mxrt] ? n - sz[mxrt] : sz[e[i].to]);
  insert(mxrt, 1);
  mnv = 1 << 30;
  for (int i = (int)(0); i <= (int)(n); i++)
    if (abs(n - 2 * i) < mnv && f[top][i]) mnv = n - 2 * i, mnid = i;
  dif = mnid;
  for (int i = (int)(top); i >= (int)(1); i--) {
    if (mnid >= q[i].second && f[i - 1][mnid - q[i].second])
      be[i] = 1, mnid -= q[i].second;
    else
      be[i] = 0;
  }
  for (int i = (int)(1); i <= (int)(top - 1); i++)
    getans(q[i].first, mxrt, be[i]);
}
