#include <bits/stdc++.h>
using namespace std;
int n;
vector<pair<int, int> > v[2];
int anchor[2];
int P[111111];
int get_p(int x) { return (P[x] == -1) ? x : (P[x] = get_p(P[x])); }
void merge(int x, int y, int val) {
  int a = get_p(x), b = get_p(y);
  if (a == b) return;
  P[a] = b;
  printf("%d %d %d\n", x, y, val);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int color, val;
    scanf("%d%d", &color, &val);
    v[color].push_back(make_pair(val, i));
    anchor[color] = i;
  }
  sort(v[0].begin(), v[0].end());
  sort(v[1].begin(), v[1].end());
  memset(P, -1, sizeof P);
  int p[2];
  p[0] = v[0].size() - 1;
  p[1] = v[1].size() - 1;
  int rem = 0, x = -1, cur_id;
  int edge_remain = n - 1;
  while (rem || p[0] >= 0 && v[0][p[0]].first ||
         p[1] >= 0 && v[1][p[1]].first) {
    if (rem == 0) {
      rem = v[0][p[0]].first;
      x = v[0][p[0]].second;
      p[0]--;
      cur_id = 0;
    }
    int nxt_id = 1 - cur_id;
    while (rem > 0) {
      pair<int, int> info = v[nxt_id][p[nxt_id]];
      int val = info.first;
      int det = min(rem, val);
      merge(x, info.second, det);
      rem -= det;
      if (val > det) {
        p[nxt_id]--;
        rem = val - det;
        cur_id = 1 - cur_id;
        x = info.second;
        break;
      } else
        p[nxt_id]--;
    }
  }
  if (edge_remain) {
    for (int i = 0; i < 2; i++)
      for (int j = 0; j < v[1 - i].size(); j++)
        merge(anchor[i], v[1 - i][j].second, 0);
  }
  return 0;
}
