#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int n;
vector<int> g[N];
int par[N], sz[N];
void dfsSz(int v, int p = -1) {
  sz[v] = 1;
  par[v] = p;
  for (int u : g[v]) {
    if (u == p) continue;
    dfsSz(u, v);
    sz[v] += sz[u];
  }
}
int dfs(int v, int p = -1) {
  for (int u : g[v]) {
    if (u != p && sz[u] > n / 2) return dfs(u, v);
  }
  return v;
}
int a[N];
void dfsOut(int v, int p, int& cur, int fact) {
  ++cur;
  par[v] = p;
  a[v] = cur * fact;
  for (int u : g[v]) {
    if (u == p) continue;
    dfsOut(u, v, cur, fact);
  }
}
int main() {
  scanf("%d", &n);
  if (n == 1) return 0;
  for (int i = 1; i < n; ++i) {
    static int u, v;
    scanf("%d%d", &u, &v);
    --u;
    --v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfsSz(0, -1);
  int root = dfs(0, -1);
  int sum = 0;
  int p = par[root];
  for (int u : g[root])
    if (u != p) sum += sz[u];
  if (p != -1) sz[p] = n - 1 - sum;
  vector<pair<int, int> > vec;
  for (int u : g[root]) vec.push_back({sz[u], u});
  sort(vec.begin(), vec.end());
  sum = 0;
  a[root] = 0;
  par[root] = -1;
  for (int i = 0; sum * 3 < n; ++i) {
    static int cur = 0;
    dfsOut(vec[i].second, root, cur, 1);
    sum += vec[i].first;
  }
  for (int u : g[root]) {
    static int cur = 0;
    if (a[u] == 0) dfsOut(u, root, cur, sum + 1);
  }
  for (int v = 0; v < n; ++v)
    if (par[v] != -1) printf("%d %d %d\n", par[v] + 1, v + 1, a[v] - a[par[v]]);
}
