#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
const int MAX_N = 1e3 + 5;
struct Edge {
  int to, nxt;
} e[MAX_N << 1];
int head[MAX_N], tote;
void add_edge(int u, int v) {
  e[++tote].to = v, e[tote].nxt = head[u];
  head[u] = tote;
}
void init(int n) {
  for (register int i = 0; i <= n; ++i) head[i] = 0;
  tote = 0;
}
int n;
int siz[MAX_N], w[MAX_N], mx = MAX_N, rt;
void dfs_1(int u, int fa) {
  siz[u] = 1, w[u] = 0;
  for (int i = head[u], v = e[i].to; i; i = e[i].nxt, v = e[i].to)
    if (v != fa) {
      dfs_1(v, u), siz[u] += siz[v];
      w[u] = max(w[u], siz[v]);
    }
  w[u] = max(w[u], n - siz[u]);
  if (mx > w[u]) mx = w[u], rt = u;
}
void dfs_2(int u, int fa) {
  siz[u] = 1;
  for (int i = head[u], v = e[i].to; i; i = e[i].nxt, v = e[i].to)
    if (v != fa) dfs_2(v, u), siz[u] += siz[v];
}
int base, tot, z[MAX_N];
void dfs_3(int u, int fa) {
  tot += base, z[u] = tot;
  printf("%d %d %d\n", u, fa, tot - z[fa]);
  for (int i = head[u], v = e[i].to; i; i = e[i].nxt, v = e[i].to)
    if (v != fa) dfs_3(v, u);
}
vector<pair<int, int> > rec;
int main() {
  scanf("%d", &n), init(n);
  for (register int i = 1; i <= n - 1; ++i) {
    int u, v;
    scanf("%d", &u), scanf("%d", &v);
    add_edge(u, v), add_edge(v, u);
  }
  dfs_1(1, 0), dfs_2(rt, 0);
  for (int i = head[rt], v = e[i].to; i; i = e[i].nxt, v = e[i].to)
    rec.push_back(pair<int, int>(siz[v], v));
  sort(rec.begin(), rec.end());
  int mid = -1, sum = 0, len = rec.size();
  for (register int i = 0; i <= len - 1; ++i) {
    sum += rec[i].first;
    if (sum >= (n - 1) / 3) {
      mid = i;
      break;
    }
  }
  base = 1, tot = 0;
  for (register int i = 0; i <= mid; ++i) dfs_3(rec[i].second, rt);
  base = tot + 1, tot = 0;
  for (register int i = mid + 1; i <= len - 1; ++i) dfs_3(rec[i].second, rt);
  return 0;
}
