#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
const int mod = 1e9 + 7;
struct Edge {
  int v, nxt;
} edge[2 * maxn];
int head[maxn], tot;
void init() {
  memset(head, -1, sizeof head);
  tot = 0;
}
void addedge(int u, int v) {
  edge[tot] = {v, head[u]};
  head[u] = tot++;
}
int n;
int f[maxn], root;
int siz[maxn];
void getroot(int u, int pre) {
  siz[u] = 1;
  f[u] = 0;
  for (int i = head[u]; ~i; i = edge[i].nxt) {
    int v = edge[i].v;
    if (v == pre) continue;
    getroot(v, u);
    f[u] = max(f[u], siz[v]);
    siz[u] += siz[v];
  }
  f[u] = max(f[u], n - siz[u]);
  if (f[u] < f[root]) root = u;
}
void dfs2(int u, int pre) {
  siz[u] = 1;
  for (int i = head[u]; ~i; i = edge[i].nxt) {
    int v = edge[i].v;
    if (v == pre) continue;
    dfs2(v, u);
    siz[u] += siz[v];
  }
}
int N, M;
void dfs(int u, int pre, int x) {
  for (int i = head[u]; ~i; i = edge[i].nxt) {
    int v = edge[i].v;
    if (v == pre) continue;
    N += M;
    cout << u << " " << v << " " << N - x << endl;
    dfs(v, u, N);
  }
}
vector<int> ve;
bool cmp(int x, int y) { return siz[x] < siz[y]; }
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  init();
  cin >> n;
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    cin >> u >> v;
    addedge(u, v);
    addedge(v, u);
  }
  f[root = 0] = inf;
  getroot(1, 0);
  dfs2(root, 0);
  for (int i = head[root]; ~i; i = edge[i].nxt) ve.push_back(edge[i].v);
  sort(ve.begin(), ve.end(), cmp);
  N = 0, M = 1;
  bool flag = false;
  for (auto v : ve) {
    if (!flag && N >= (n - 1) / 3) {
      M = N + 1, N = 0, flag = true;
    }
    N += M;
    cout << root << " " << v << " " << N << "\n";
    dfs(v, root, N);
  }
  return 0;
}
