#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100100;
int n, uf[MAXN];
vector<pair<int, int>> v[2];
vector<tuple<int, int, int>> ans;
inline int find(int x) { return uf[x] ? uf[x] = find(uf[x]) : x; }
void join(int x, int y) {
  if ((x = find(x)) == (y = find(y))) return;
  uf[y] = x;
}
int main() {
  scanf("%d", &n);
  for (int i = 1, c, s; i <= n; ++i)
    scanf("%d %d", &c, &s), v[c].emplace_back(s, i);
  sort(v[0].begin(), v[0].end()), sort(v[1].begin(), v[1].end());
  for (int i = 0, j = 0, s, id, x, s_, id_; i < v[0].size(); ++i) {
    tie(s, id) = v[0][i];
    while (s > 0) {
      tie(s_, id_) = v[1][j];
      x = min(s, s_);
      s -= x, s_ -= x;
      join(id, id_);
      v[1][j] = make_pair(s_, id_);
      ans.emplace_back(id, id_, x);
      if (s_ == 0) j++;
    }
  }
  for (int i = 0, id; i < v[0].size(); ++i) {
    tie(ignore, id) = v[0][i];
    if (find(id) != find(v[1][0].second))
      join(id, v[1][0].second), ans.emplace_back(id, v[1][0].second, 0);
  }
  for (int i = 0, id; i < v[1].size(); ++i) {
    tie(ignore, id) = v[1][i];
    if (find(id) != find(v[0][0].second))
      join(id, v[0][0].second), ans.emplace_back(id, v[0][0].second, 0);
  }
  for (const auto& [u, v, w] : ans) printf("%d %d %d\n", u, v, w);
}
