#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
set<pair<int, int> > b, w;
int s[MAXN];
int n;
set<pair<int, pair<int, int> > > edges;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  scanf("%d", &n);
  int lab = -1, law = -1;
  for (auto i = 0; i != n; i++) {
    int c;
    scanf("%d%d", &c, &s[i]);
    if (c == 0)
      b.insert(make_pair(s[i], i));
    else
      w.insert(make_pair(s[i], i));
  }
  int es = 0;
  while (!b.empty() && !w.empty()) {
    if (b.begin()->first < w.begin()->first) {
      int i = b.begin()->second, j = w.begin()->second;
      edges.insert(make_pair(i + 1, make_pair(j + 1, s[i])));
      b.erase(b.begin());
      w.erase(w.begin());
      s[j] -= s[i];
      if (lab == -1) lab = i;
      w.insert(make_pair(s[j], j));
    } else {
      int i = w.begin()->second, j = b.begin()->second;
      edges.insert(make_pair(i + 1, make_pair(j + 1, s[i])));
      w.erase(w.begin());
      b.erase(b.begin());
      s[j] -= s[i];
      if (law == -1) law = i;
      b.insert(make_pair(s[j], j));
    }
    es++;
  }
  if (!b.empty())
    b.erase(b.begin());
  else if (!w.empty())
    w.erase(w.begin());
  while (es != n - 1 && !b.empty()) {
    edges.insert(make_pair(law + 1, make_pair(1 + b.begin()->second, 0)));
    b.erase(b.begin());
    es++;
  }
  while (es != n - 1 && !w.empty()) {
    edges.insert(make_pair(lab + 1, make_pair(1 + w.begin()->second, 0)));
    w.erase(w.begin());
    es++;
  }
  for (auto c : edges)
    printf("%d %d %d\n", c.first, c.second.first, c.second.second);
  return 0;
}
