#include <bits/stdc++.h>
using namespace std;
const long long INF = 2e18;
int n, a, b, nrf[1005];
vector<int> val[1005];
vector<int> v[1005], q;
vector<pair<long long, long long> > H;
struct ceva {
  int a, b, c;
};
vector<ceva> ans;
void dfs(int nod, int ant) {
  nrf[nod]++;
  for (auto it : v[nod]) {
    if (it == ant) continue;
    dfs(it, nod);
    nrf[nod] += nrf[it];
  }
}
int getCent(int nod, int ant) {
  int mx = 0, sav;
  for (auto it : v[nod]) {
    if (it == ant) continue;
    if (nrf[it] > mx) {
      mx = nrf[it];
      sav = it;
    }
  }
  if (2 * mx > n) return getCent(sav, nod);
  return nod;
}
void place(int nod, int ant, int s) {
  for (auto it : v[nod]) {
    if (it == ant) continue;
    int aux = q.back();
    q.pop_back();
    ans.push_back({nod, it, aux - s});
    place(it, nod, aux);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i < n; i++) {
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  if (n == 1) return 0;
  if (n == 2) {
    cout << "1 2 1\n";
    return 0;
  }
  dfs(1, -1);
  int x = getCent(1, -1);
  memset(nrf, 0, sizeof(nrf));
  dfs(x, -1);
  int sa = 0, sb = 0;
  vector<int> a, b;
  int nr = 0;
  for (auto it : v[x]) {
    H.push_back({nrf[it], nr + 1});
    val[++nr].push_back(it);
  }
  make_heap(H.begin(), H.end(),
            [](pair<long long, long long> a, pair<long long, long long> b) {
              return a.first > b.first;
            });
  while (H.size() > 2) {
    pair<long long, long long> a = H[0];
    pop_heap(H.begin(), H.end(),
             [](pair<long long, long long> a, pair<long long, long long> b) {
               return a > b;
             });
    H.pop_back();
    pair<long long, long long> b = H[0];
    pop_heap(H.begin(), H.end(),
             [](pair<long long, long long> a, pair<long long, long long> b) {
               return a > b;
             });
    H.pop_back();
    if (val[a.second].size() < val[b.second].size())
      swap(val[a.second], val[b.second]);
    for (auto it : val[b.second]) val[a.second].push_back(it);
    H.push_back({a.first + b.first, a.second});
    push_heap(H.begin(), H.end(),
              [](pair<long long, long long> a, pair<long long, long long> b) {
                return a > b;
              });
  }
  if (n > 2) {
    assert(H[0].first >= (n + 1) / 3);
    assert(H[1].first >= (n + 1) / 3);
  }
  sa = H[0].first;
  sb = H[1].first;
  a = val[H[0].second];
  b = val[H[1].second];
  for (int i = sa; i >= 1; i--) q.push_back(i);
  for (auto it : a) {
    ans.push_back({x, it, q.back()});
    int aux = q.back();
    q.pop_back();
    place(it, x, aux);
  }
  for (int i = sb; i >= 1; i--) q.push_back(i * (sa + 1));
  for (auto it : b) {
    ans.push_back({x, it, q.back()});
    int aux = q.back();
    q.pop_back();
    place(it, x, aux);
  }
  for (auto it : ans) cout << it.a << ' ' << it.b << ' ' << it.c << '\n';
  return 0;
}
