#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200
using namespace std;
struct node
{
int x,y,z;
};
int cmp(node a,node b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int mymax(int x,int y)
{
if(x>y) return x;
return y;
}
int main()
{
int n;
int Case=0;
while(cin>>n&&n)
{
node fuck[maxn];
int dp[maxn];
memset(dp,0,sizeof(dp));
int ret=0;
while(n--)
{
int x,y,z;
cin>>x>>y>>z;
fuck[ret].x=x,fuck[ret].y=y,fuck[ret++].z=z;
fuck[ret].x=x,fuck[ret].y=z,fuck[ret++].z=y;
fuck[ret].x=y,fuck[ret].y=x,fuck[ret++].z=z;
fuck[ret].x=y,fuck[ret].y=z,fuck[ret++].z=x;
fuck[ret].x=z,fuck[ret].y=x,fuck[ret++].z=y;
fuck[ret].x=z,fuck[ret].y=y,fuck[ret++].z=x;
}
sort(fuck,fuck+ret,cmp);
dp[0]=fuck[0].z;
for(int i=1;i<ret;i++)
{
dp[i]=fuck[i].z;
for(int j=0;j<i;j++)
{
if(fuck[j].x<fuck[i].x&&fuck[j].y<fuck[i].y)
{
dp[i]=mymax(dp[i],dp[j]+fuck[i].z);
}
}
}
//这里的dp只是算出了每个i对应的值 并没有算出最大的
int zz=dp[0];
for(int i=1;i<ret;i++) if(zz<dp[i]) zz=dp[i];
printf("Case %d: maximum height = %d\n",++Case,zz);
}
return 0;
}