#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
vector<int> g[N];
int n, c;
int subtree_size[N];
int first[N], color[N];
vector<long long> targets;
int ptr = 0;
void dfs(int x, int par) {
  subtree_size[x] = 1;
  for (int y : g[x]) {
    if (y == par) continue;
    dfs(y, x);
    subtree_size[x] += subtree_size[y];
  }
}
int get_centroid(int x, int par) {
  bool is_centroid = true;
  int heaviest_child = -1;
  for (int y : g[x]) {
    if (y == par) continue;
    if (subtree_size[y] > n / 2) {
      is_centroid = false;
    }
    if (heaviest_child == -1 ||
        subtree_size[y] > subtree_size[heaviest_child]) {
      heaviest_child = y;
    }
  }
  if (is_centroid && n - subtree_size[x] <= n / 2) {
    return x;
  }
  return get_centroid(heaviest_child, x);
}
int get_centroid() {
  dfs(1, 0);
  return get_centroid(1, 0);
}
int find(int x) { return first[x] == x ? x : (first[x] = find(first[x])); }
void solve(int x, int par, long long cursum) {
  int edgeVal = 0;
  if (x != c) {
    edgeVal = targets[ptr++] - cursum;
    printf("%d %d %d\n", x, par, edgeVal);
  }
  for (int y : g[x]) {
    if (y == par) continue;
    solve(y, x, cursum + edgeVal);
  }
}
int main() {
  for (int i = 0; i < N; i++) {
    first[i] = i;
  }
  scanf("%d", &n);
  if (n == 1) return 0;
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
    if (n == 2) {
      printf("%d %d 1\n", u, v);
      return 0;
    }
  }
  c = get_centroid();
  dfs(c, 0);
  set<pair<int, int>> second;
  for (int d : g[c]) {
    second.insert({subtree_size[d], d});
  }
  while (second.size() > 2) {
    auto u = *second.begin();
    second.erase(second.begin());
    auto v = *second.begin();
    second.erase(second.begin());
    first[u.second] = v.second;
    second.insert({u.first + v.first, v.second});
  }
  int rep_1 = second.begin()->second;
  int rep_2 = second.rbegin()->second;
  int A = second.begin()->first;
  int B = second.rbegin()->first;
  vector<int> a, b;
  for (int d : g[c]) {
    if (find(d) == rep_1) {
      a.push_back(d);
      color[d] = 0;
    } else {
      b.push_back(d);
      color[d] = 1;
    }
  }
  sort(g[c].begin(), g[c].end(),
       [](int u, int v) -> bool { return color[u] < color[v]; });
  for (int i = 1; i <= A; i++) {
    targets.push_back(i);
  }
  for (int i = 1; i <= B; i++) {
    targets.push_back(i * 1ll * (A + 1));
  }
  solve(c, 0, 0);
  return 0;
}
