#include <bits/stdc++.h>
using namespace std;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  vector<vector<int>> g(n);
  for (int i = 0; i < n - 1; ++i) {
    int u, v;
    cin >> u >> v;
    g[u - 1].push_back(v - 1);
    g[v - 1].push_back(u - 1);
  }
  vector<int> size(n);
  function<void(int, int)> dfs_calc = [&](int v, int p) {
    size[v] = 1;
    for (int to : g[v]) {
      if (to != p) {
        dfs_calc(to, v);
        size[v] += size[to];
      }
    }
  };
  function<int(int, int)> find_centroid = [&](int v, int p) {
    for (int to : g[v]) {
      if (size[to] > n / 2 and to != p) {
        return find_centroid(to, v);
      }
    }
    return v;
  };
  dfs_calc(0, -1);
  int c = find_centroid(0, -1);
  dfs_calc(c, -1);
  sort(g[c].begin(), g[c].end(),
       [&](int a, int b) { return size[a] > size[b]; });
  vector<int> a, b;
  int sa = 0, sb = 0;
  for (int to : g[c]) {
    if (sa <= sb) {
      sa += size[to];
      a.push_back(to);
    } else {
      sb += size[to];
      b.push_back(to);
    }
  }
  vector<int> order;
  function<void(int, int)> dfs_order = [&](int v, int p) {
    order.push_back(v);
    for (int to : g[v]) {
      if (to != p) {
        dfs_order(to, v);
      }
    }
  };
  for (int v : a) {
    dfs_order(v, c);
  }
  vector<int> val(n);
  for (int i = 0; i < order.size(); ++i) {
    val[order[i]] = i + 1;
  }
  order.clear();
  for (int v : b) {
    dfs_order(v, c);
  }
  for (int i = 0; i < order.size(); ++i) {
    val[order[i]] = (i + 1) * (sa + 1);
  }
  function<void(int, int)> dfs_ans = [&](int v, int p) {
    for (int to : g[v]) {
      if (to != p) {
        cout << v + 1 << ' ' << to + 1 << ' ' << val[to] - val[v] << '\n';
        dfs_ans(to, v);
      }
    }
  };
  dfs_ans(c, -1);
  return 0;
}
