#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;
}