#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, rt, delta, now, limit, m;
int weight[N], sz[N], value[N];
pair<int, int> p[N];
vector<int> a[N];
template <typename T>
inline void chkmax(T &x, T y) {
  x = max(x, y);
}
template <typename T>
inline void chkmin(T &x, T y) {
  x = min(x, y);
}
template <typename T>
inline void read(T &x) {
  T f = 1;
  x = 0;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -f;
  for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
  x *= f;
}
inline void getroot(int u, int par) {
  sz[u] = 1;
  weight[u] = 0;
  for (unsigned i = 0; i < a[u].size(); ++i) {
    int v = a[u][i];
    if (v == par) continue;
    getroot(v, u);
    sz[u] += sz[v];
    chkmax(weight[u], sz[v]);
  }
  chkmax(weight[u], n - sz[u]);
  if (weight[u] < weight[rt]) rt = u;
}
inline void DFS(int u, int par) {
  sz[u] = 1;
  for (unsigned i = 0; i < a[u].size(); ++i) {
    int v = a[u][i];
    if (v == par) continue;
    DFS(v, u);
    sz[u] += sz[v];
  }
}
inline void work(int u, int par) {
  now += delta;
  value[u] = now;
  printf("%d %d %d\n", u, par, value[u] - value[par]);
  for (unsigned i = 0; i < a[u].size(); ++i) {
    int v = a[u][i];
    if (v != par) work(v, u);
  }
}
int main() {
  read(n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    read(u);
    read(v);
    a[u].push_back(v);
    a[v].push_back(u);
  }
  weight[rt = 0] = n;
  getroot(1, 0);
  DFS(rt, 0);
  for (unsigned i = 0; i < a[rt].size(); ++i)
    p[++m] = make_pair(sz[a[rt][i]], a[rt][i]);
  sort(p + 1, p + m + 1);
  now = 0;
  for (int i = 1; i <= m; ++i) {
    now += p[i].first;
    if (now >= (n - 1) / 3) {
      limit = i;
      break;
    }
  }
  delta = 1;
  now = 0;
  for (int i = 1; i <= limit; ++i) work(p[i].second, rt);
  delta = now + 1;
  now = 0;
  for (int i = limit + 1; i <= m; ++i) work(p[i].second, rt);
  return 0;
}
