#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1e3 + 100;
const int LogN = 20;
long long Inf = 1e9 + 100;
const int dx[4] = {0, 1, 0, -1};
const int dy[4] = {1, 0, -1, 0};
const double eps = 1e-9;
int md = 2520;
struct el {
  int v, u, c;
};
vector<el> Ans;
vector<int> Gr[MaxN];
int Sz[MaxN];
int Ct = -1;
int N;
int Next = 1;
int Add = 1;
int find(int v, int p = -1, int c = 0) {
  int Mx = 0;
  int Sum = 1;
  for (int to : Gr[v]) {
    if (to == p) continue;
    int k = find(to, v, c + 1);
    Sum += k;
    if (Ct != -1) return Sum;
    Sz[to] = k;
    Mx = ((Mx) > (Sz[to]) ? (Mx) : (Sz[to]));
  }
  Mx = ((Mx) > (N - Sum) ? (Mx) : (N - Sum));
  if (Mx <= N / 2 && Ct == -1) {
    Ct = v;
    Sz[p] = N - Sum;
  }
  return Sum;
}
void dfs(int v, int k, int p = -1) {
  for (int to : Gr[v]) {
    if (p == to) continue;
    Ans.push_back({v, to, Next - k});
    Next += Add;
    dfs(to, Next - Add, v);
  }
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cout << fixed << setprecision(5);
  cin >> N;
  for (int i = 0; i < N - 1; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    Gr[a].push_back(b);
    Gr[b].push_back(a);
  }
  find(0);
  vector<pair<int, int> > Mt;
  for (int to : Gr[Ct]) {
    Mt.push_back({Sz[to], to});
  }
  sort(Mt.begin(), Mt.end());
  vector<pair<int, int> > At;
  int k = 0;
  while (k < (N - 1) / 3 + ((N - 1) % 3 != 0)) {
    At.push_back(Mt.back());
    Mt.pop_back();
    k += At.back().first;
  }
  for (pair<int, int> a : At) {
    Ans.push_back({Ct, a.second, Next});
    Next += Add;
    dfs(a.second, Next - Add, Ct);
  }
  Add = (k + 1);
  Next = k + 1;
  for (pair<int, int> a : Mt) {
    Ans.push_back({Ct, a.second, Next});
    Next += Add;
    dfs(a.second, Next - Add, Ct);
  }
  for (el a : Ans) {
    cout << a.v + 1 << ' ' << a.u + 1 << ' ' << a.c << '\n';
  }
  return 0;
}
