#include <bits/stdc++.h>
using namespace std;
struct node {
  int node_no;
  int sum;
};
node B[100000];
node C[100000];
node BlackList[100000];
node WhiteList[100000];
int edge[100000][3];
void merge(node A[], int p, int q, int r) {
  int n1 = q - p + 2;
  int n2 = r - q + 1;
  int i, j;
  for (i = 0; i < n1 - 1; i++) {
    B[i] = A[p + i];
  }
  for (j = 0; j < n2 - 1; j++) {
    C[j] = A[q + j + 1];
  }
  i = 0;
  j = 0;
  B[n1 - 1].sum = 10000000000;
  C[n2 - 1].sum = 10000000000;
  for (int k = p; k <= r; k++) {
    if (B[i].sum <= C[j].sum) {
      A[k] = B[i];
      i++;
    } else {
      A[k] = C[j];
      j++;
    }
  }
}
void mergeSort(node A[], int p, int r) {
  if (p < r) {
    int q = (p + r) / 2;
    mergeSort(A, p, q);
    mergeSort(A, q + 1, r);
    merge(A, p, q, r);
  }
}
int main() {
  int i, n, x, b = 0, w = 0, c, k = 0;
  int total = 0;
  cin >> n;
  for (i = 0; i < n; i++) {
    cout << endl;
    cin >> c;
    if (c == 0) {
      WhiteList[w].node_no = (k + 1);
      cout << "  ";
      cin >> x;
      WhiteList[w].sum = x;
      total += x;
      w++;
      k++;
    } else {
      BlackList[b].node_no = (k + 1);
      cout << "  ";
      cin >> x;
      BlackList[b].sum = x;
      k++;
      b++;
    }
  }
  mergeSort(WhiteList, 0, (w - 1));
  mergeSort(BlackList, 0, (b - 1));
  WhiteList[w].sum = 10000000000;
  WhiteList[w].node_no = WhiteList[w - 1].node_no;
  BlackList[b].sum = 10000000000;
  BlackList[b].node_no = BlackList[b - 1].node_no;
  int edgesum = 0, B = 0, W = 0, e = 0;
  int Bsum, Wsum, Bl = 0, Wl = 0;
  while (e < (n - 1)) {
    Bsum = BlackList[B].sum;
    Wsum = WhiteList[W].sum;
    if (Bsum < Wsum) {
      WhiteList[W].sum = WhiteList[W].sum - BlackList[B].sum;
      edge[e][0] = BlackList[B].node_no;
      edge[e][1] = WhiteList[W].node_no;
      edge[e][2] = BlackList[B].sum;
      edgesum += BlackList[B].sum;
      BlackList[B].sum = 0;
      if (B < b) B++;
      e++;
    } else {
      BlackList[B].sum = BlackList[B].sum - WhiteList[W].sum;
      edge[e][0] = BlackList[B].node_no;
      edge[e][1] = WhiteList[W].node_no;
      edge[e][2] = WhiteList[W].sum;
      edgesum += WhiteList[W].sum;
      WhiteList[W].sum = 0;
      if (W < w) W++;
      e++;
    }
    if (W == w && Bl == 0) {
      B++;
      Bl = 1;
    }
    if (B == b && Wl == 0) {
      W++;
      Wl = 1;
    }
  }
  cout << endl;
  for (i = 0; i < e; i++) {
    cout << endl;
    cout << edge[i][0] << "  " << edge[i][1] << "  " << edge[i][2];
  }
  return 0;
}
