#include <bits/stdc++.h>
using namespace std;
const int N = 1024;
int n, vis[N], sz[N], d[N][N];
vector<int> g[N];
void centroid_dfs(int i, int pa) {
  sz[i] = 1;
  for (int j : g[i])
    if (j != pa) {
      centroid_dfs(j, i);
      sz[i] += sz[j];
    }
}
bool is_centroid(int i) {
  centroid_dfs(i, -1);
  for (int j : g[i])
    if (sz[j] > (n) / 2) return 0;
  return 1;
}
void wrong_answer(string m) {
  cout << 0 << endl;
  cout << m << endl;
  cout << n << endl;
  for (int i = 0, ggd = n; i < ggd; i++)
    for (int j = i + 1, ggd = n; j < ggd; j++)
      if (d[i][j]) {
        cout << i + 1 << " " << j + 1 << " " << d[i][j] << endl;
      }
  exit(0);
}
int get_centroid() {
  for (int i = 0, ggd = n; i < ggd; i++)
    if (is_centroid(i)) return i;
  wrong_answer("Cant find centroid. Absurd");
  assert(0);
}
void assign(int i, int pa, int st, int take, vector<int>& v) {
  if (0) {
    cout << "assign: " << i + 1 << " with pa " << pa + 1 << endl;
    cout << "v: ";
    for (int i : v) cout << i << " ";
    cout << endl;
    cout << "starting at " << st << " and take: " << take << endl;
  }
  d[i][pa] = d[pa][i] = v[st] - take;
  int cur = st + 1;
  for (int j : g[i])
    if (j != pa) {
      assign(j, i, cur, v[st], v);
      cur += sz[j];
    }
}
long long fl[N][N], INF = 1e9;
void floyd() {
  for (int k = 0, ggd = n; k < ggd; k++)
    for (int i = 0, ggd = n; i < ggd; i++)
      if (fl[i][k] < INF)
        for (int j = 0, ggd = n; j < ggd; j++)
          if (fl[k][j] < INF) fl[i][j] = min(fl[i][j], fl[i][k] + fl[k][j]);
}
int check() {
  for (int i = 0, ggd = n; i < ggd; i++)
    for (int j = 0, ggd = n; j < ggd; j++) fl[i][j] = INF;
  for (int i = 0, ggd = n; i < ggd; i++) fl[i][i] = 0;
  for (int i = 0, ggd = n; i < ggd; i++)
    for (int j = 0, ggd = n; j < ggd; j++)
      if (d[i][j]) fl[i][j] = d[i][j];
  floyd();
  set<int> s;
  for (int i = 0, ggd = n; i < ggd; i++)
    for (int j = 0, ggd = n; j < ggd; j++) s.insert(fl[i][j]);
  for (int i = 1, ggd = (2 * n * n) / 9 + 1; i < ggd; i++)
    if (!s.count(i)) return i;
  return 0;
}
int solve() {
  cin >> n;
  for (int i = 0, ggd = n - 1; i < ggd; i++) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  int c = get_centroid(), suml = 0, sumr = 0;
  vector<int> l, r;
  priority_queue<pair<int, vector<int>>, vector<pair<int, vector<int>>>,
                 greater<pair<int, vector<int>>>>
      pq;
  for (int i : g[c]) pq.push({sz[i], {i}});
  while (((int)(pq).size()) > 2) {
    auto t1 = pq.top();
    pq.pop();
    auto t2 = pq.top();
    pq.pop();
    for (auto it : t2.second) t1.second.push_back(it);
    t1.first += t2.first;
    pq.push(t1);
  }
  if (((int)(pq).size())) l = pq.top().second, suml = pq.top().first, pq.pop();
  if (((int)(pq).size())) r = pq.top().second, sumr = pq.top().first, pq.pop();
  if (0) {
    cout << "centroid: " << c + 1 << endl;
    cout << "l: ";
    for (int j : l) cout << j + 1 << " ";
    cout << " : " << suml << endl;
    cout << "r: ";
    for (int j : r) cout << j + 1 << " ";
    cout << " : " << sumr << endl;
  }
  if (((int)(l).size()))
    if (!(suml >= (n + 1) / 3)) wrong_answer("BADSUM");
  if (((int)(r).size()))
    if (!(sumr >= (n + 1) / 3)) wrong_answer("BADSUM");
  vector<int> v_l, v_r;
  for (int i = 0, ggd = suml; i < ggd; i++) v_l.push_back(i + 1);
  for (int i = 0, ggd = sumr; i < ggd; i++) v_r.push_back((suml + 1) * (i + 1));
  if (0) {
    cout << "v_l: ";
    for (int i : v_l) cout << i << " ";
    cout << endl;
    cout << "v_r: ";
    for (int i : v_r) cout << i << " ";
    cout << endl;
  }
  int cur = 0;
  for (int i : l) {
    assign(i, c, cur, 0, v_l);
    cur += sz[i];
  }
  cur = 0;
  for (int i : r) {
    assign(i, c, cur, 0, v_r);
    cur += sz[i];
  }
  return check();
}
int main() {
  ios::sync_with_stdio(false);
  if (0) {
    freopen("out", "w", stdout);
  }
  int res = solve();
  if (res) {
    wrong_answer("Failed: " + to_string(res));
  } else {
    if (0)
      cout << 1 << endl;
    else {
      for (int i = 0, ggd = n; i < ggd; i++)
        for (int j = i + 1, ggd = n; j < ggd; j++)
          if (d[i][j]) {
            cout << i + 1 << " " << j + 1 << " " << d[i][j] << endl;
          }
    }
  }
}
