#include<bits/stdc++.h>
using namespace std;
#define maxn 500001
struct node
{
int x,y,z;
}a[maxn];
struct edge
{
int x,y,z,i,j;
bool opt;
}ans[maxn];
int n,cnt=0;
bool opt=0;
bool vis[maxn];
inline bool cmp(node a,node b)
{
if(a.x!=b.x) return a.x<b.x;
else if(a.y!=b.y) return a.y<b.y;
return a.z<b.z;
}
inline int swz(int r1,int r2,int r3)
{
return floor(0.25*pow(min(r1,min(r2,r3)),3));
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y>>a[i].z;
for(int i=1;i<=n;i++)
{
bool flag=0;
for(int j=i+1;j<=n;j++)
{
if(a[i].x==a[j].x && a[i].y==a[j].y && !ans[cnt].opt)
{
ans[++cnt].x=a[i].x;
ans[cnt].y=a[i].y;
ans[cnt].z=a[i].z+a[j].z;
ans[cnt].i=i; ans[cnt].j=j;
ans[cnt].opt=1; flag=1;
break;
}
if(a[i].x==a[j].x && a[i].z==a[j].z && !ans[cnt].opt)
{
ans[++cnt].x=a[i].x;
ans[cnt].z=a[i].z;
ans[cnt].y=a[i].y+a[j].y;
ans[cnt].i=i; ans[cnt].j=j;
ans[cnt].opt=1; flag=1;
break;
}
if(a[i].y==a[j].y && a[i].z==a[j].z && !ans[cnt].opt)
{
ans[++cnt].y=a[i].y;
ans[cnt].z=a[i].z;
ans[cnt].x=a[i].x+a[j].x;
ans[cnt].i=i; ans[cnt].j=j;
ans[cnt].opt=1; flag=1;
break;
}
}
if(flag==0)
{
ans[++cnt].x=a[i].x;
ans[cnt].y=a[i].y;
ans[cnt].z=a[i].z;
ans[cnt].i=i,ans[cnt].j=-1;
ans[cnt].opt=0;
}
}int a1=0,a2=0,a3=0,t1=0,t2=0,t3=0;
for(int i=1;i<=cnt;i++)
{
t1=swz(ans[i].x,ans[i].y,ans[i].z);
if(a3<t1)
{
a3=t1;
t2=i;
}
}
a1=ans[t2].opt;
if(a1==0) cout<<a1<<endl<<ans[t2].i<<endl<<a3;
else cout<<a1<<endl<<ans[t2].i<<" "<<ans[t2].j<<endl<<a3;
return 0;
}
rainbow