#include
#include

#define N 100000
#define M 1000000007
#define MIN(A, B) ((A) < (B) ? (A) : (B)) int i1, i2, k; double max; struct item { int i, a, b, c; struct item *next; } *ht[N]; int hash(int a, int b) { long long hash = (11LL * ((71LL * a) + b)) % M; return (313LL * hash + 11LL) % M % N; } struct item *getkey(int a, int b) { int h = hash(a, b); struct item *x; for (x = ht[h]; x != NULL; x = x->next)
if (x->a == a && x->b == b)
return x;
return NULL;
}

void put(int i, int a, int b, int c) {
struct item *x = getkey(a, b);

if (x == NULL) {
int h = hash(a, b);

x = malloc(sizeof(*x));
x->a = a;
x->b = b;
x->c = 0;
x->next = ht[h];
ht[h] = x;
}
if (x->c < c) { x->i = i;
x->c = c;
}
}

void get(int i, int a, int b, int c) {
struct item *x;
int a_, b_, c_, two;
double min;

if ((x = getkey(a, b)) != NULL) {
a_ = a;
b_ = b;
c_ = c + x->c;
min = MIN(a_, MIN(b_, c_)) / 2.0;
two = 1;
} else {
a_ = a;
b_ = b;
c_ = c;
min = MIN(a_, MIN(b_, c_)) / 2.0;
two = 0;
}
if (max < min) { max = min; if (two) { k = 2; i1 = x->i;
i2 = i;
} else {
k = 1;
i1 = i;
}
}
}

int main() {
int i, n;

scanf(“%d”, &n);
max = 0;
k = i1 = i2 = -1;
for (i = 0; i < n; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); get(i, a, b, c); get(i, a, c, b); get(i, b, c, a); put(i, a, b, c); put(i, b, a, c); put(i, b, c, a); put(i, c, b, a); put(i, a, c, b); put(i, c, a, b); } printf("%d\n", k); printf("%d", i1 + 1); if (k == 2) printf(" %d", i2 + 1); printf("\n"); return 0; }