#include <bits/stdc++.h>
using namespace std;
const int MAXN = 110000;
int weight[MAXN], color[MAXN];
int N;
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    q[2];
int c0, c1;
int fat[MAXN];
int Find(int x);
void Join(int x, int y) {
  int m = Find(x), n = Find(y);
  fat[n] = m;
}
int Find(int x) {
  if (fat[x] != x) {
    fat[x] = Find(fat[x]);
  }
  return fat[x];
}
int main() {
  cin >> N;
  for (int i = 1; i <= N; i++) {
    cin >> color[i] >> weight[i];
    if (color[i] == 1)
      c1 = i;
    else
      c0 = i;
  }
  for (int i = 1; i <= N; i++) fat[i] = i;
  for (int i = 1; i <= N; i++) {
    q[color[i]].push(make_pair(weight[i], i));
  }
  int c = 0;
  while (c < N - 1) {
    if (q[0].empty() || q[1].empty()) break;
    pair<int, int> a = q[0].top();
    pair<int, int> b = q[1].top();
    q[0].pop();
    q[1].pop();
    if (a.first <= b.first) {
      cout << a.second << " " << b.second << " " << a.first << endl;
      b.first -= a.first;
      q[1].push(b);
    } else {
      cout << a.second << " " << b.second << " " << b.first << endl;
      a.first -= b.first;
      q[0].push(a);
    }
    Join(a.second, b.second);
    c++;
  }
  for (int i = 1; i <= N; i++) {
    if (Find(i) != Find(1)) {
      if (color[i] == 0) {
        cout << i << " " << c1 << " " << 0 << endl;
        Join(i, c1);
      } else {
        cout << i << " " << c0 << " " << 0 << endl;
        Join(i, c0);
      }
    }
  }
  return 0;
}
