#include <bits/stdc++.h>
using namespace std;
set<pair<long, long> > dw, db, rw, rb;
set<pair<long, long> >::iterator it, it1, it2;
long n, c[200000], s[200000];
long c1, c2, nv1, nv;
vector<pair<pair<long, long>, long> > ans;
void add_edge(long a, long b, long c) {
  ans.push_back(make_pair(make_pair(a, b), c));
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> c[i] >> s[i];
    if (c[i] == 0)
      rb.insert(make_pair(s[i], i));
    else
      rw.insert(make_pair(s[i], i));
  }
  for (int i = 1; i < n; i++) {
    if (rb.size() > 0) {
      it1 = rb.begin();
      c1 = (*it1).first;
    } else
      c1 = 2e9;
    if (rw.size() > 0) {
      it2 = rw.begin();
      c2 = (*it2).first;
    } else
      c2 = 2e9;
    if (rb.size() == 1 && c1 <= c2) {
      it1 = rb.begin();
      long qq = (*it1).second;
      for (it = rw.begin(); it != rw.end(); ++it) {
        long q = (*it).second;
        add_edge(q, qq, s[qq]);
        s[qq] = 0;
      }
      break;
    }
    if (rw.size() == 1 && c1 >= c2) {
      it1 = rw.begin();
      long qq = (*it1).second;
      for (it = rb.begin(); it != rb.end(); ++it) {
        long q = (*it).second;
        add_edge(q, qq, s[qq]);
        s[qq] = 0;
      }
      break;
    }
    if (c1 > c2) {
      nv = (*it2).second;
      if (rb.size()) {
        nv1 = (*it1).second;
      } else {
        it1 = db.begin();
        nv1 = (*it1).second;
      }
      add_edge(nv, nv1, c2);
      rw.erase(rw.begin());
      if (rb.size()) {
        rb.erase(rb.begin());
        s[nv1] -= c2;
        rb.insert(make_pair(s[nv1], nv1));
      }
      dw.insert(make_pair(0, nv));
    } else {
      nv = (*it1).second;
      if (rw.size()) {
        nv1 = (*it2).second;
      } else {
        it2 = dw.begin();
        nv1 = (*it2).second;
      }
      add_edge(nv, nv1, c1);
      rb.erase(rb.begin());
      if (rw.size()) {
        rw.erase(rw.begin());
        s[nv1] -= c1;
        rw.insert(make_pair(s[nv1], nv1));
      }
      db.insert(make_pair(0, nv));
    }
  }
  for (int i = 0; i < n - 1; i++) {
    cout << ans[i].first.first << " " << ans[i].first.second << " "
         << ans[i].second << endl;
  }
  cin.get();
  cin.get();
  return 0;
}
