#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
inline int read() {
  char c = getchar();
  int x = 0;
  bool f = 0;
  for (; !isdigit(c); c = getchar()) f ^= !(c ^ 45);
  for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  if (f) x = -x;
  return x;
}
int n, m;
struct edge {
  int to, nxt, w;
} e[200005 << 1];
int tot = 1, head[200005];
inline void adde(int u, int v) {
  e[++tot] = (edge){v, head[u]};
  head[u] = tot;
}
int sz[200005], mxp[200005], rt, sum;
void getrt(int u, int pa) {
  sz[u] = 1, mxp[u] = 0;
  for (int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if (v == pa) continue;
    getrt(v, u);
    sz[u] += sz[v];
    mxp[u] = max(mxp[u], sz[v]);
  }
  mxp[u] = max(mxp[u], sum - sz[u]);
  if (mxp[u] < mxp[rt]) rt = u;
}
int fa[200005], pos[200005], son1, son2;
inline int getf(int x) { return x == fa[x] ? x : fa[x] = getf(fa[x]); }
struct node {
  int u, sz;
  bool operator<(const node &b) const { return sz > b.sz; }
} rec[200005];
priority_queue<node> q;
void dfs(int u, int pa, int mul) {
  int cur = 1;
  for (int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if (v == pa || v == rt) continue;
    e[i].w = e[i ^ 1].w = mul * cur;
    dfs(v, u, mul);
    cur += sz[v];
  }
}
signed main() {
  n = read();
  for (register int i = (2); i <= (n); ++i) {
    int u = read(), v = read();
    adde(u, v), adde(v, u);
  }
  if (n == 1) return 0;
  if (n == 2) return puts("1 2 233") & 0;
  mxp[rt] = sum = n;
  getrt(1, 0), getrt(rt, 0);
  for (int i = head[rt]; i; i = e[i].nxt) {
    int v = e[i].to;
    rec[++m] = (node){m, sz[v]};
    q.push(rec[m]), fa[m] = m;
    pos[m] = v;
  }
  while (q.size() > 1) {
    int u = getf(q.top().u);
    q.pop();
    int v = getf(q.top().u);
    q.pop();
    if (!q.empty() || rec[u].sz + rec[v].sz <= n / 2) {
      fa[u] = v;
      rec[v].sz += rec[u].sz;
      q.push(rec[v]);
    } else {
      q.push(rec[u]), q.push(rec[v]);
      break;
    }
  }
  int u = getf(q.top().u);
  q.pop();
  int v = getf(q.top().u);
  q.pop();
  son1 = n + 1, son2 = n + 2;
  for (register int i = (1); i <= (m); ++i) {
    int qwq = getf(i) == u ? son1 : son2;
    adde(qwq, pos[i]), adde(pos[i], qwq);
  }
  dfs(son1, 0, 1), dfs(son2, 0, rec[u].sz + 1);
  for (int i = 2; i <= tot; i += 2) {
    int x = e[i].to, y = e[i ^ 1].to;
    if (x == rt || y == rt) continue;
    if (x == son1 || x == son2) x = rt;
    if (y == son1 || y == son2) y = rt;
    cout << x << ' ' << y << ' ' << e[i].w << endl;
  }
  return 0;
}
