#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
struct Ans {
  int tot;
  int a[2];
  void set(int _tot, int a0, int a1 = 0) {
    tot = _tot;
    a[0] = a0;
    a[1] = a1;
  }
};
struct pii {
  int fir, sec;
  pii(int f, int s) {
    fir = f;
    sec = s;
  }
  bool operator<(pii b) const {
    if (fir != b.fir) return fir < b.fir;
    return sec < b.sec;
  }
};
inline int mymin(int a, int b, int c) {
  if (a < b && a < c) return a;
  if (b < c) return b;
  return c;
}
void roll(int &a, int &b, int &c) {
  int t = a;
  a = b;
  b = c;
  c = t;
}
int n, T = 1;
int maxd = 0;
map<pii, int> mp;
int x, y, z;
int p[MAXN * 6][2];
Ans ans;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d %d %d", &x, &y, &z);
    if (maxd < mymin(x, y, z)) {
      maxd = mymin(x, y, z);
      ans.set(1, i);
    }
    for (int cnt = 1; cnt <= 3; cnt++) {
      if (cnt == 2) {
        if (x == z) continue;
      }
      if (cnt == 3) {
        if (y == z) continue;
      }
      if (mp[pii(x, y)] == 0) {
        mp[pii(x, y)] = T;
        p[T][0] = z;
        p[T][1] = i;
        ++T;
        mp[pii(y, x)] = T;
        p[T][0] = z;
        p[T][1] = i;
        ++T;
      } else {
        int tmp = mymin(x, y, z + p[mp[pii(x, y)]][0]);
        if (tmp > maxd) {
          maxd = tmp;
          ans.set(2, i, p[mp[pii(x, y)]][1]);
        }
        if (z > p[mp[pii(x, y)]][0]) {
          p[mp[pii(x, y)]][0] = z;
          p[mp[pii(x, y)]][1] = i;
          p[mp[pii(y, x)]][0] = z;
          p[mp[pii(y, x)]][1] = i;
        }
      }
      roll(x, y, z);
    }
  }
  printf("%d\n", ans.tot);
  if (ans.tot == 1)
    printf("%d\n", ans.a[0]);
  else
    printf("%d %d\n", ans.a[0], ans.a[1]);
  return 0;
}
