#include <bits/stdc++.h>   using namespace std;   int i, n, mx, mn, p1, p2, poz, poz1, poz2, k, mx1, mx2, m, mij, u, x, y, z, q;   struct para {     int x, y, z, ind;   } a[100007];   int cmp(para k1, para k2) {     if (k1.x > k2.x)       return 0;     else if (k1.x == k2.x) {       if (k1.y > k2.y)         return 0;       else if (k1.y == k2.y) {         if (k1.z > k2.z)           return 0;         else if (k1.z == k2.z) {           return 0;         }         return 1;       }       return 1;     }     return 1;   }   int main() {     scanf( %d , &n);     mx = -1;     for (i = 1; i <= n; i++) {       scanf( %d%d%d , &a[i].x, &a[i].y, &a[i].z);       a[i].ind = i;       mn = a[i].x;       if (mn > a[i].y) mn = a[i].y;       if (mn > a[i].z) mn = a[i].z;       if (mx < mn) {         mx = mn;         k = 1;         poz = a[i].ind;       }       m = max(max(a[i].x, a[i].y), a[i].z);       mij = a[i].x + a[i].y + a[i].z - m - mn;       a[i].x = mn;       a[i].y = mij;       a[i].z = m;     }     sort(a + 1, a + n + 1, cmp);     for (i = 1; i <= n; i++) {       mx1 = -1;       mx2 = -1;       u = 0;       while (a[i].x == a[i + 1].x && a[i].y == a[i + 1].y) {         u = 1;         if (mx1 < a[i].z) {           mx2 = mx1;           poz2 = poz1;           mx1 = a[i].z;           poz1 = a[i].ind;         } else if (mx2 < a[i].z) {           mx2 = a[i].z;           poz2 = a[i].ind;         }         i++;       }       if (u == 1) {         if (mx1 < a[i].z) {           mx2 = mx1;           poz2 = poz1;           mx1 = a[i].z;           poz1 = a[i].ind;         } else if (mx2 < a[i].z) {           mx2 = a[i].z;           poz2 = a[i].ind;         }       }       q = min(min(a[i].x, a[i].y), mx1 + mx2);       if (mx < q) {         mx = q;         k = 2;         p1 = poz1;         p2 = poz2;       }     }     for (i = 1; i <= n; i++) {       x = a[i].x;       y = a[i].y;       z = a[i].z;       a[i].x = y;       a[i].y = z;       a[i].z = x;     }     sort(a + 1, a + n + 1, cmp);     for (i = 1; i <= n; i++) {       mx1 = -1;       mx2 = -1;       u = 0;       while (a[i].x == a[i + 1].x && a[i].y == a[i + 1].y) {         u = 1;         if (mx1 < a[i].z) {           mx2 = mx1;           poz2 = poz1;           mx1 = a[i].z;           poz1 = a[i].ind;         } else if (mx2 < a[i].z) {           mx2 = a[i].z;           poz2 = a[i].ind;         }         i++;       }       if (u == 1) {         if (mx1 < a[i].z) {           mx2 = mx1;           poz2 = poz1;           mx1 = a[i].z;           poz1 = a[i].ind;         } else if (mx2 < a[i].z) {           mx2 = a[i].z;           poz2 = a[i].ind;         }       }       q = min(min(a[i].x, a[i].y), mx1 + mx2);       if (mx < q) {         mx = q;         k = 2;         p1 = poz1;         p2 = poz2;       }     }     for (i = 1; i <= n; i++) {       x = a[i].x;       y = a[i].y;       z = a[i].z;       a[i].x = y;       a[i].y = z;       a[i].z = x;     }     sort(a + 1, a + n + 1, cmp);     for (i = 1; i <= n; i++) {       mx1 = -1;       mx2 = -1;       u = 0;       while (a[i].x == a[i + 1].x && a[i].y == a[i + 1].y) {         u = 1;         if (mx1 < a[i].z) {           mx2 = mx1;           poz2 = poz1;           mx1 = a[i].z;           poz1 = a[i].ind;         } else if (mx2 < a[i].z) {           mx2 = a[i].z;           poz2 = a[i].ind;         }         i++;       }       if (u == 1) {         if (mx1 < a[i].z) {           mx2 = mx1;           poz2 = poz1;           mx1 = a[i].z;           poz1 = a[i].ind;         } else if (mx2 < a[i].z) {           mx2 = a[i].z;           poz2 = a[i].ind;         }       }       q = min(min(a[i].x, a[i].y), mx1 + mx2);       if (mx < q) {         mx = q;         k = 2;         p1 = poz1;         p2 = poz2;       }     }     printf( %d n , k);     if (k == 1)       printf( %d n , poz);     else {       printf( %d %d n , p1, p2);     }     return 0;   }