#include <bits/stdc++.h>
const long long oo = 0x3f3f3f3f;
const int _cnt = 1000 * 1000;
const int _p = 1000 * 1000 * 1000 + 7;
long long o(long long x) { return x % _p; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
using namespace std;
void file_put() {
  freopen("filename.in", "r", stdin);
  freopen("filename.out", "w", stdout);
}
int n, c, s, p, q, cnt = 0;
struct ttype {
  int s, id;
  ttype() {}
  ttype(int _s, int _id) {
    s = _s;
    id = _id;
  }
};
vector<ttype> V[2];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &c, &s);
    V[c].push_back(ttype(s, i));
  }
  p = V[0].back().id;
  q = V[1].back().id;
  while (!V[0].empty() && !V[1].empty()) {
    if (V[0].back().s >= V[1].back().s) {
      V[0].back().s -= V[1].back().s;
      printf("%d %d% d\n", V[0].back().id, V[1].back().id, V[1].back().s);
      V[1].pop_back();
      cnt++;
      continue;
    }
    if (V[1].back().s >= V[0].back().s) {
      V[1].back().s -= V[0].back().s;
      printf("%d %d% d\n", V[0].back().id, V[1].back().id, V[0].back().s);
      V[0].pop_back();
      cnt++;
    }
  }
  if (!V[0].empty()) V[0].pop_back();
  if (!V[1].empty()) V[1].pop_back();
  while (!V[0].empty()) {
    if (cnt >= n - 1) break;
    printf("%d %d% d\n", V[0].back().id, q, 0);
    cnt++;
    V[0].pop_back();
  }
  while (!V[1].empty()) {
    if (cnt >= n - 1) break;
    printf("%d %d% d\n", V[1].back().id, p, 0);
    V[1].pop_back();
    cnt++;
  }
  return 0;
}
