#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
const int oo = 1e9 + 5;
int du[] = {-1, 0, 0, 1};
int dv[] = {0, -1, 1, 0};
const long long mod = 1e9 + 7;
long long sqr(long long x) { return x * x; }
struct data {
  int u, v, w;
  data(int U = 0, int V = 0, int W = 0) {
    u = U;
    v = V;
    w = W;
  }
} edge[N + 5];
int n, s[N + 5], cnt;
vector<pair<int, int> > q1, q2;
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int k;
    cin >> k >> s[i];
    if (k == 1)
      q1.push_back({s[i], i});
    else
      q2.push_back({s[i], i});
  }
  sort(q1.begin(), q1.end());
  sort(q2.begin(), q2.end());
  int vt1 = 0, vt2 = 0;
  while (vt1 < q1.size() && vt2 < q2.size()) {
    if (q1[vt1].first < q2[vt2].first) {
      int u = q1[vt1].second, v = q2[vt2].second;
      edge[++cnt] = data(u, v, s[u]);
      s[v] -= s[u];
      s[u] = 0;
      q2[vt2].first = s[v];
      vt1++;
    } else {
      int u = q1[vt1].second, v = q2[vt2].second;
      edge[++cnt] = data(u, v, s[v]);
      s[u] -= s[v];
      s[v] = 0;
      q1[vt1].first = s[u];
      vt2++;
    }
  }
  if (vt1 >= q1.size())
    for (int i = vt2 + 1; i < q2.size(); i++)
      edge[++cnt] = data(q1[vt1 - 1].second, q2[i].second, 0);
  if (vt2 >= q2.size())
    for (int i = vt1 + 1; i < q1.size(); i++)
      edge[++cnt] = data(q1[i].second, q2[vt2 - 1].second, 0);
  for (int i = 1; i < n; i++)
    cout << edge[i].u << " " << edge[i].v << " " << edge[i].w << endl;
  return 0;
}
