#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000")
using namespace std;
const long long mod = 1000000007;
const long long md = 1234567891;
const long long bil = 1000000000;
const char aa = 'a';
const double eps = 1E-9;
const int mil = 1000000;
const int ths = 1000;
const int maxn = 1001;
const int dr[] = {0, -1, 0, 1};
const int dc[] = {1, 0, -1, 0};
const int mxx = 32;
const int inf = (int)1E9;
template <typename T>
void printV(vector<T>& v) {
  for (int i = 0; i < (int)(v.size()); i++) cout << v[i] << " ";
  cout << endl;
}
template <typename T>
void printVs(vector<vector<T> >& v) {
  for (int i = 0; i < (int)(v.size()); i++) printV(v[i]);
}
long long gcd(long long m, long long n) {
  if (m == 0 || n == 0) return m + n;
  return gcd(n, m % n);
}
const int mxn = 100001;
bool cmpf(vector<int> a, vector<int> b) { return (a[0] > b[0]); }
void run() {
  int n;
  int s[mxn];
  int c[mxn];
  cin >> n;
  for (int i = 0; i < (int)(n); i++) cin >> c[i] >> s[i];
  vector<vector<int> > A;
  vector<vector<int> > B;
  for (int i = 0; i < (int)(n); i++) {
    vector<int> v(3);
    v[0] = s[i];
    v[1] = c[i];
    v[2] = i;
    if (c[i])
      B.push_back(v);
    else
      A.push_back(v);
  }
  vector<vector<int> > res;
  sort(A.begin(), A.end(), cmpf);
  sort(B.begin(), B.end(), cmpf);
  int a = A.size() - 1;
  int b = B.size() - 1;
  while (a >= 0 && b >= 0) {
    int v = min(A[a][0], B[b][0]);
    A[a][0] -= v;
    B[b][0] -= v;
    vector<int> e(3);
    e[0] = A[a][2] + 1;
    e[1] = B[b][2] + 1;
    e[2] = v;
    res.push_back(e);
    if (A[a][0] == 0 && (a || b == 0))
      --a;
    else
      --b;
  }
  for (int i = 0; i < (int)(res.size()); i++) printV(res[i]);
}
int main() { run(); }
