#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 5;
struct node {
  int to, next;
} edges[MAXN << 1];
int head[MAXN], edge;
int dp[MAXN];
int n;
int root, max_root;
int fa[MAXN];
void add(int u, int v) {
  edges[edge].to = v;
  edges[edge].next = head[u];
  head[u] = edge++;
}
void dfs(int u, int p) {
  dp[u] = 1;
  fa[u] = p;
  int max_val = 0;
  for (int i = head[u]; i != -1; i = edges[i].next) {
    int v = edges[i].to;
    if (v == p) continue;
    dfs(v, u);
    dp[u] += dp[v];
    max_val = max(max_val, dp[v]);
  }
  max_val = max(max_val, n - dp[u]);
  if (max_val < max_root) {
    max_root = max_val;
    root = u;
  }
}
vector<pair<int, int> > s, S1, S2;
int now, tot;
int to[MAXN];
void dfs1(int u, int p) {
  to[u] = ++now;
  printf("%d %d %d\n", u, p, (now - to[p]) * (tot + 1));
  for (int i = head[u]; i != -1; i = edges[i].next) {
    int v = edges[i].to;
    if (v == p) continue;
    dfs1(v, u);
  }
}
int main() {
  memset(head, -1, sizeof(head));
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }
  max_root = 0x3f3f3f3f;
  dfs(1, 0);
  for (int i = head[root]; i != -1; i = edges[i].next) {
    int v = edges[i].to;
    if (v == fa[root])
      s.push_back(make_pair(n - dp[root], v));
    else
      s.push_back(make_pair(dp[v], v));
  }
  sort(s.begin(), s.end());
  reverse(s.begin(), s.end());
  int sum1 = 0, sum2 = 0;
  for (int i = 0; i < s.size(); i++) {
    if (sum1 > sum2)
      sum2 += s[i].first, S2.push_back(s[i]);
    else
      sum1 += s[i].first, S1.push_back(s[i]);
  }
  if (S1.size() < S2.size()) swap(S1, S2);
  now = 0, tot = 0;
  to[root] = 0;
  for (int i = 0; i < S1.size(); i++) {
    dfs1(S1[i].second, root);
  }
  tot = now;
  now = 0;
  for (int i = 0; i < S2.size(); i++) {
    dfs1(S2[i].second, root);
  }
  return 0;
}
