#include <bits/stdc++.h>
using namespace std;
void read(int &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -f;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  x *= f;
}
void print(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (!x) return;
  print(x / 10), putchar(x % 10 + 48);
}
void write(int x) {
  if (!x)
    putchar('0');
  else
    print(x);
  putchar('\n');
}
const int maxn = 1e6 + 10;
const int inf = 1e9;
const double eps = 1e-8;
const int mod = 1e9 + 7;
int rt, f[maxn], sz[maxn], head[maxn], tot, n;
struct edge {
  int to, nxt;
} e[maxn << 1];
void ins(int u, int v) { e[++tot] = (edge){v, head[u]}, head[u] = tot; }
void get_rt(int x, int fa) {
  sz[x] = 1;
  for (int i = head[x]; i; i = e[i].nxt)
    if (e[i].to != fa)
      get_rt(e[i].to, x), sz[x] += sz[e[i].to], f[x] = max(f[x], sz[e[i].to]);
  f[x] = max(f[x], n - sz[x]);
  if (f[x] < f[rt]) rt = x;
}
priority_queue<pair<int, int> > q;
int fa[maxn];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void put_ans(int x, int fa, int t) {
  int p = 1;
  for (int i = head[x]; i; i = e[i].nxt)
    if (e[i].to != fa) {
      printf("%d %d %lld\n", x, e[i].to, 1ll * p * t);
      put_ans(e[i].to, x, t);
      p += sz[e[i].to];
    }
}
int main() {
  read(n);
  if (n == 1) return 0;
  if (n == 2) return puts("1 2 1"), 0;
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int x, y, i = 1; i < n; i++) read(x), read(y), ins(x, y), ins(y, x);
  f[rt] = 1e9;
  get_rt(1, 0);
  int x = rt;
  for (int v, i = head[x]; i; i = e[i].nxt)
    get_rt(v = e[i].to, x), q.push(make_pair(-sz[v], v));
  while (q.size() > 2) {
    int x = q.top().second, a = q.top().first;
    q.pop();
    int y = q.top().second, b = q.top().first;
    q.pop();
    fa[find(y)] = find(x);
    q.push(make_pair(a + b, x));
  }
  int a = q.top().second, s = -q.top().first;
  q.pop();
  int b = q.top().second;
  q.pop();
  int p = 1;
  for (int i = head[x]; i; i = e[i].nxt)
    if (find(e[i].to) == a) {
      printf("%d %d %d\n", x, e[i].to, p);
      put_ans(e[i].to, x, 1), p += sz[e[i].to];
    }
  p = 1;
  for (int i = head[x]; i; i = e[i].nxt)
    if (find(e[i].to) == b) {
      printf("%d %d %lld\n", x, e[i].to, 1ll * p * (s + 1));
      put_ans(e[i].to, x, s + 1), p += sz[e[i].to];
    }
  return 0;
}
