// Timothy Chan    "ch3dquad.cc"    12/02    3-d lower hull (in C++)

// O(nh) gift-wrapping algorithm

//   input/output: see "ch3d.cc"
//   warning: ignores degeneracies and robustness


#include <stream.h>

struct Point { double x, y, z; };

inline double turn(Point p, Point q, Point r) {  // <0 iff cw
  return (q.x-p.x)*(r.y-p.y) - (r.x-p.x)*(q.y-p.y);
}

inline double orient(Point p, Point q, Point r, Point s) {
  // <0 iff s is above pqr, assuming pqr is cw
  return (q.z-p.z)*turn(p,r,s) - (r.z-p.z)*turn(p,q,s) +
         (s.z-p.z)*turn(p,q,r);
}

Point *P;
int n, *I, *J, *K, h = 0;

void wrap(int i, int j) {
  int k, l, m;
  for (m = 0; m < h; m++)  // check if facet hasn't been explored
    if ((I[m] == i && J[m] == j) || (J[m] == i && K[m] == j) ||
        (K[m] == i && I[m] == j)) return;
  for (k = i, l = 0; l < n; l++)  // wrap from edge ij to find facet ijk
    if (turn(P[i],P[j],P[l]) < 0 && orient(P[i],P[j],P[k],P[l]) >= 0) 
      k = l;
  if (turn(P[i],P[j],P[k]) >= 0) return;
  I[h] = i;  J[h] = j;  K[h++] = k;
  cout << i << " " << j << " " << k << "\n";
  wrap(k,j);  // explore adjacent facets
  wrap(i,k);  
}

main() {

  int i, j, k, l;  
  cin >> n;

  P = new Point[n]; 
  for (i = 0; i < n; i++) { cin >> P[i].x; cin >> P[i].y; cin >> P[i].z; }

  for (i = 0, l = 1; l < n; l++)  // find initial edge ij
    if (P[i].x > P[l].x) i = l;
  for (j = i, l = 0; l < n; l++)
    if (i != l && turn(P[i],P[j],P[l]) >= 0) j = l;

  I = new int[2*n];  J = new int[2*n];  K = new int[2*n];
  wrap(i,j);
  delete I;  delete J;  delete K;  delete P;
}

