#include<bits/stdc++.h>
using namespace std;
int read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void write(int w) {
if(w<0) {
putchar('-');
w=-w;
}
if(w>9) write(w/10);
putchar(w%10+'0');
}
struct node {
int x,y,z;
} a[1000005];
typedef pair<int,int> pii;
map<pii,pii>mp;
int b[3];
int xa[105],xb[105],xc[105];
int main () {
int n;
n=read();
for(int i=1; i<=n; i++) {
pii tmp;
b[0]=read();
b[1]=read();
b[2]=read();
sort(b,b+3);
a[i].x=b[0];
a[i].y=b[1];
a[i].z=b[2];
tmp.first=b[0];
tmp.second=b[1];
mp[tmp]=make_pair(max(mp[tmp].first,b[0]),i);
tmp.first=b[0];
tmp.second=b[2];
mp[tmp]=make_pair(max(mp[tmp].first,b[0]),i);
tmp.first=b[1];
tmp.second=b[2];
mp[tmp]=make_pair(max(mp[tmp].first,b[0]),i);
tmp.first=b[1];
tmp.second=b[0];
mp[tmp]=make_pair(max(mp[tmp].first,b[0]),i);
tmp.first=b[2];
tmp.second=b[1];
mp[tmp]=make_pair(max(mp[tmp].first,b[0]),i);
tmp.first=b[2];
tmp.second=b[0];
mp[tmp]=make_pair(max(mp[tmp].first,b[0]),i);
}
int opt=0;
int idi,idj;
int ans=0;
for(int i=1; i<=n; i++) {
xa[1]=a[i].x,xb[1]=a[i].y,xc[1]=a[i].z;
xa[2]=a[i].x,xb[2]=a[i].z,xc[2]=a[i].y;
xa[3]=a[i].y,xb[3]=a[i].z,xc[3]=a[i].x;
xa[4]=a[i].y,xb[4]=a[i].x,xc[4]=a[i].z;
xa[5]=a[i].z,xb[5]=a[i].x,xc[5]=a[i].y;
xa[6]=a[i].z,xb[6]=a[i].y,xc[6]=a[i].x;
int qq=min(a[i].y,a[i].x);
int qq1=min(a[i].z,qq);
int qq2=qq1*qq1*qq1/4;
if(qq2>ans) {
opt=0;
idi=i;
ans=qq2;
}
pii tmp;
tmp.first=xa[1];
tmp.second=xb[1];
tmp.first=xa[1];
tmp.second=xb[1];
if(mp[tmp].first>0&&mp[tmp].second!=i) {
int q=mp[tmp].first+min(min(a[i].x,a[i].y),a[i].z);
int q0=min(min(a[i].x,a[i].y),a[i].z);
int q01,q02;
if(q0==a[i].x){
q01=a[i].y;
q02=a[i].z;
}
if(q0==a[i].y){
q01=a[i].x;
q02=a[i].z;
}
if(q0==a[i].z){
q01=a[i].y;
q02=a[i].x;
}
int q1=min(q01,q02);
int q2=min(q1,q);
int q3=q2*q2*q2/4;
if(q3>ans) {
opt=1;
idi=mp[tmp].second;
idj=i;
ans=q3;
}
}
tmp.first=xa[2];
tmp.second=xb[2];
if(mp[tmp].first>0&&mp[tmp].second!=i) {
int q=mp[tmp].first+min(min(a[i].x,a[i].y),a[i].z);
int q1=min(a[i].y,a[i].x);
int q2=min(q1,q);
int q3=q2*q2*q2/4;
if(q3>ans) {
opt=1;
idi=mp[tmp].second;
idj=i;
ans=q3;
}
}
tmp.first=xa[3];
tmp.second=xb[3];
if(mp[tmp].first>0&&mp[tmp].second!=i) {
int q=mp[tmp].first+min(min(a[i].x,a[i].y),a[i].z);
int q0=min(min(a[i].x,a[i].y),a[i].z);
int q01,q02;
if(q0==a[i].x){
q01=a[i].y;
q02=a[i].z;
}
if(q0==a[i].y){
q01=a[i].x;
q02=a[i].z;
}
if(q0==a[i].z){
q01=a[i].y;
q02=a[i].x;
}
int q1=min(q01,q02);
int q2=min(q1,q);
int q3=q2*q2*q2/4;
if(q3>ans) {
opt=1;
idi=mp[tmp].second;
idj=i;
ans=q3;
}
}
tmp.first=xa[4];
tmp.second=xb[4];
if(mp[tmp].first>0&&mp[tmp].second!=i) {
int q=mp[tmp].first+min(min(a[i].x,a[i].y),a[i].z);
int q0=min(min(a[i].x,a[i].y),a[i].z);
int q01,q02;
if(q0==a[i].x){
q01=a[i].y;
q02=a[i].z;
}
if(q0==a[i].y){
q01=a[i].x;
q02=a[i].z;
}
if(q0==a[i].z){
q01=a[i].y;
q02=a[i].x;
}
int q1=min(q01,q02);
int q2=min(q1,q);
int q3=q2*q2*q2/4;
if(q3>ans) {
opt=1;
idi=mp[tmp].second;
idj=i;
ans=q3;
}
}
tmp.first=xa[5];
tmp.second=xb[5];
if(mp[tmp].first>0&&mp[tmp].second!=i) {
int q=mp[tmp].first+min(min(a[i].x,a[i].y),a[i].z);
int q0=min(min(a[i].x,a[i].y),a[i].z);
int q01,q02;
if(q0==a[i].x){
q01=a[i].y;
q02=a[i].z;
}
if(q0==a[i].y){
q01=a[i].x;
q02=a[i].z;
}
if(q0==a[i].z){
q01=a[i].y;
q02=a[i].x;
}
int q1=min(q01,q02);
int q2=min(q1,q);
int q3=q2*q2*q2/4;
if(q3>ans) {
opt=1;
idi=mp[tmp].second;
idj=i;
ans=q3;
}
}
tmp.first=xa[6];
tmp.second=xb[6];
if(mp[tmp].first>0&&mp[tmp].second!=i) {
int q=mp[tmp].first+min(min(a[i].x,a[i].y),a[i].z);
int q0=min(min(a[i].x,a[i].y),a[i].z);
int q01,q02;
if(q0==a[i].x){
q01=a[i].y;
q02=a[i].z;
}
if(q0==a[i].y){
q01=a[i].x;
q02=a[i].z;
}
if(q0==a[i].z){
q01=a[i].y;
q02=a[i].x;
}
int q1=min(q01,q02);
int q2=min(q1,q);
int q3=q2*q2*q2/4;
if(q3>ans) {
opt=1;
idi=mp[tmp].second;
idj=i;
ans=q3;
}
}
}
if(opt==0){
printf("%d\n%d\n%d\n",opt,idi,ans);
}
else{
printf("%d\n",opt);
if(idi>idj){
swap(idi,idj);
}
printf("%d %d\n",idi,idj);
printf("%d\n",ans);
}
return 0;
}