#include <bits/stdc++.h>
const long long N = 1e4 + 10;
const long long mod = 1e9 + 7;
const long long inf = 0x3f3f3f3f;
const double eps = 1e-9;
using namespace std;
template <typename tp>
inline void read(tp &x) {
  x = 0;
  char c = getchar();
  bool f = 0;
  for (; c < '0' || c > '9'; f |= (c == '-'), c = getchar())
    ;
  for (; c >= '0' && c <= '9'; x = (x << 3) + (x << 1) + c - '0', c = getchar())
    ;
  if (f) x = -x;
}
int n, small, sizes[N];
struct Edge {
  int next, to;
} edge[N];
int head[N], cnt, maxn[N], s, zu[N];
void add(int from, int to) {
  edge[++cnt] = {head[from], to};
  head[from] = cnt;
}
void insert(int from, int to) {
  add(from, to);
  add(to, from);
}
void pu(int from, int to, int cost) { printf("%d %d %d\n", from, to, cost); }
int dfs(int now, int fa, int ret = 1) {
  for (int i = head[now]; i; i = edge[i].next) {
    int to = edge[i].to;
    if (to == fa) continue;
    int flag = dfs(to, now);
    ret += flag;
    maxn[now] = max(maxn[now], flag);
  }
  if (max(maxn[now], n - ret) * 2 <= n) s = now;
  return ret;
}
int dfs_fen(int now, int fa, int ret = 1) {
  vector<pair<int, int> > vec;
  vec.clear();
  for (int i = head[now]; i; i = edge[i].next) {
    int to = edge[i].to;
    if (to == fa) continue;
    int flag = dfs_fen(to, now);
    if (now == fa) vec.push_back(pair<int, int>(to, flag));
    ret += flag;
  }
  if (now == fa) {
    int siz = vec.size();
    sort(vec.begin(), vec.end());
    for (int i = 0; i < siz; i++) {
      if (small + vec[i].second < n * 2 / 3)
        small += vec[i].second, zu[vec[i].first] = 1;
      else
        zu[vec[i].first] = 2;
    }
  }
  sizes[now] = ret;
  return ret;
}
void dfs_ans(int now, int fa, int times) {
  int flag = 0;
  for (int i = head[now]; i; i = edge[i].next) {
    int to = edge[i].to;
    if (to == fa) continue;
    pu(now, to, (flag + 1) * times);
    dfs_ans(to, now, times);
    flag += sizes[to];
  }
}
int l = 0, r = 0;
signed main() {
  read(n);
  for (int i = 1, u, v; i < n; i++) read(u), read(v), insert(u, v);
  dfs(1, 1);
  dfs_fen(s, s);
  small++;
  for (int i = head[s]; i; i = edge[i].next) {
    int to = edge[i].to;
    if (zu[to] == 1) {
      pu(s, to, l + 1);
      l += sizes[to];
      dfs_ans(to, s, 1);
    } else {
      pu(s, to, (r + 1) * small);
      r += sizes[to];
      dfs_ans(to, s, small);
    }
  }
  return 0;
}
