#include <bits/stdc++.h>
using namespace std;
struct p {
  int x, y;
  friend bool operator<(const p& x, const p& y) {
    if (x.x < y.x) return true;
    if (x.x > y.x) return false;
    return x.y < y.y;
  }
  friend bool operator!=(const p& x, const p& y) {
    if (x.x != y.x || x.y != y.y) return true;
    return false;
  }
};
struct r {
  int v, v2, i, i2, cnt;
};
map<p, r> mp;
p g(int x, int y) { return {min(x, y), max(x, y)}; }
int main() {
  int n;
  scanf("%d", &n);
  int a[n], b[n], c[n];
  for (int i = 0; i < n; i++) {
    scanf("%d %d %d", &a[i], &b[i], &c[i]);
  }
  int rj = 0, rx[2], rc = 1;
  for (int i = 0; i < n; i++) {
    if (min(min(a[i], b[i]), c[i]) > rj) {
      rx[0] = i + 1;
      rj = min(min(a[i], b[i]), c[i]);
    }
  }
  for (int i = 0; i < n; i++) {
    if (!mp.count({g(a[i], b[i])})) {
      mp[g(a[i], b[i])] = {c[i], 0, i, -1, 1};
    } else {
      if (mp[g(a[i], b[i])].v < c[i])
        mp[g(a[i], b[i])] = {c[i], mp[g(a[i], b[i])].v, i, mp[g(a[i], b[i])].i,
                             mp[g(a[i], b[i])].cnt + 1};
      else
        mp[g(a[i], b[i])] = {mp[g(a[i], b[i])].v, c[i], mp[g(a[i], b[i])].i, i,
                             mp[g(a[i], b[i])].cnt + 1};
    }
    if (!mp.count({g(a[i], c[i])}) &&
        (g(a[i], c[i]) != g(a[i], b[i]) && g(a[i], c[i]) != g(b[i], c[i]))) {
      mp[g(a[i], c[i])] = {b[i], 0, i, -1, 1};
    } else if ((g(a[i], c[i]) != g(a[i], b[i]) &&
                g(a[i], c[i]) != g(b[i], c[i]))) {
      if (mp[g(a[i], c[i])].v < b[i])
        mp[g(a[i], c[i])] = {b[i], mp[g(a[i], c[i])].v, i, mp[g(a[i], c[i])].i,
                             mp[g(a[i], c[i])].cnt + 1};
      else
        mp[g(a[i], c[i])] = {mp[g(a[i], c[i])].v, b[i], mp[g(a[i], c[i])].i, i,
                             mp[g(a[i], c[i])].cnt + 1};
    }
    if (!mp.count({g(c[i], b[i])}) &&
        (g(c[i], b[i]) != g(a[i], b[i]) && g(c[i], b[i]) != g(c[i], a[i]))) {
      mp[g(c[i], b[i])] = {a[i], 0, i, -1, 1};
    } else if ((g(c[i], b[i]) != g(a[i], b[i]) &&
                g(c[i], b[i]) != g(c[i], a[i]))) {
      if (mp[g(c[i], b[i])].v < a[i])
        mp[g(c[i], b[i])] = {a[i], mp[g(c[i], b[i])].v, i, mp[g(c[i], b[i])].i,
                             mp[g(c[i], b[i])].cnt + 1};
      else
        mp[g(c[i], b[i])] = {mp[g(c[i], b[i])].v, a[i], mp[g(c[i], b[i])].i, i,
                             mp[g(c[i], b[i])].cnt + 1};
    }
  }
  for (int i = 0; i < n; i++) {
    if (mp.count({g(a[i], b[i])}) &&
        (mp[g(a[i], b[i])].cnt > 1 || mp[g(a[i], b[i])].i != i)) {
      if (mp[g(a[i], b[i])].i != i)
        c[i] += mp[g(a[i], b[i])].v;
      else
        c[i] += mp[g(a[i], b[i])].v2;
      if (min(min(a[i], b[i]), c[i]) > rj) {
        rc = 2;
        rj = min(min(a[i], b[i]), c[i]);
        if (mp[g(a[i], b[i])].i != i)
          rx[0] = mp[g(a[i], b[i])].i + 1;
        else
          rx[0] = mp[g(a[i], b[i])].i2 + 1;
        rx[1] = i + 1;
      }
      if (mp[g(a[i], b[i])].i != i)
        c[i] -= mp[g(a[i], b[i])].v;
      else
        c[i] -= mp[g(a[i], b[i])].v2;
    }
    if (mp.count({g(a[i], c[i])}) &&
        (mp[g(a[i], c[i])].cnt > 1 || mp[g(a[i], c[i])].i != i)) {
      if (mp[g(a[i], c[i])].i != i)
        b[i] += mp[g(a[i], c[i])].v;
      else
        b[i] += mp[g(a[i], c[i])].v2;
      if (min(min(a[i], b[i]), c[i]) > rj) {
        rc = 2;
        rj = min(min(a[i], b[i]), c[i]);
        if (mp[g(a[i], c[i])].i != i)
          rx[0] = mp[g(a[i], c[i])].i + 1;
        else
          rx[0] = mp[g(a[i], c[i])].i2 + 1;
        rx[1] = i + 1;
      }
      if (mp[g(a[i], c[i])].i != i)
        b[i] -= mp[g(a[i], c[i])].v;
      else
        b[i] -= mp[g(a[i], c[i])].v2;
    }
    if (mp.count({g(c[i], b[i])}) &&
        (mp[g(c[i], b[i])].cnt > 1 || mp[g(c[i], b[i])].i != i)) {
      if (mp[g(c[i], b[i])].i != i)
        a[i] += mp[g(c[i], b[i])].v;
      else
        a[i] += mp[g(c[i], b[i])].v2;
      if (min(min(a[i], b[i]), c[i]) > rj) {
        rc = 2;
        rj = min(min(a[i], b[i]), c[i]);
        if (mp[g(c[i], b[i])].i != i)
          rx[0] = mp[g(c[i], b[i])].i + 1;
        else
          rx[0] = mp[g(c[i], b[i])].i2 + 1;
        rx[1] = i + 1;
      }
      if (mp[g(c[i], b[i])].i != i)
        a[i] -= mp[g(c[i], b[i])].v;
      else
        a[i] -= mp[g(c[i], b[i])].v2;
    }
  }
  printf("%d\n", rc);
  for (int i = 0; i < rc; i++) printf("%d ", rx[i]);
  return 0;
}
