/////////////////////////////////////////////////////////////////////
//猴子与香蕉
//把每一种方块化为三个,先排序,再用n^2的dp
#include<iostream>
#include<algorithm>
using namespace std;
struct block
{
int x;
int y;
int height;
}bl[100];
void maxmin(int &a,int &b,int &c)
{
if(a<b && a<c)
if(b<c);
else swap(b,c);
else if(b<c && b<a)
{
swap(a,b);
if(b<c);
else swap(b,c);
}
else
{
swap(a,c);
if(b<c);
else swap(b,c);
}
}
bool comp(const block &a, const block &b)
{
if(a.x!=b.x) return (a.x<b.x);
else return (a.y<=a.y);
}
int main()
{
int i,j,n,a,b,c,count=1,max;
while(cin>>n && n!=0)
{
for(i=1;i<=3*n;i=i+3)
{
cin>>a>>b>>c;
maxmin(a,b,c);
bl[i].x=a;
bl[i].y=b;
bl[i].height=c;
bl[i+1].x=a;
bl[i+1].y=c;
bl[i+1].height=b;
bl[i+2].x=b;
bl[i+2].y=c;
bl[i+2].height=a;
}
bl[0].x=bl[0].y=bl[0].height=0;
sort(bl,bl+3*n+1,comp);
for(i=1;i<=3*n;i++)
{
max=0;
for(j=0;j<i;j++)
{
if(bl[i].x>bl[j].x && bl[i].y>bl[j].y && bl[j].height>max)
max=bl[j].height;
}
bl[i].height+=max;
}
max=0;
for(i=1;i<=3*n;i++)
if(bl[i].height>max)
max=bl[i].height;
cout<<"Case "<<count<<": maximum height = "<<max<<endl;
count++;
}
return 0;
}