#include <iostream>
#include <cstring>
using namespace std;
//d(x,y)以第x个立方体的第y条边做高能达到的最高高度,递推方程d(x,y)=max(d(i,j))+h[x][y],1<=i<=n,1<=j<=3,记忆化搜索求解
int h[101][101];
int n;
int d[101][101]={0};
void deal(int x,int y,int &min1,int &max1)
{
if(y==1)
{
max1=max(h[x][2],h[x][3]);
min1=min(h[x][2],h[x][3]);
}
if(y==2)
{
max1=max(h[x][1],h[x][3]);
min1=min(h[x][1],h[x][3]);
}
if(y==3)
{
max1=max(h[x][1],h[x][2]);
min1=min(h[x][1],h[x][2]);
}
}
int dp(int x,int y)
{
int &ans=d[x][y];
if(ans)
return ans;
int min1,max1;
deal(x,y,min1,max1);
int min2,max2;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
{
deal(i,j,min2,max2);
if((max2<max1&&min2<min1)||(max2<min1)) //是否可以放置
ans=max(ans,dp(i,j));
}
ans+=h[x][y];
return ans;
}
int main()
{
int num=0;
while(cin>>n&&n)
{
num++;
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
cin>>h[i][j];
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
ans=max(ans,dp(i,j));
cout<<"Case "<<num<<": maximum height = "<<ans<<endl;
}
return 0;
}
#include <cstring>
using namespace std;
//d(x,y)以第x个立方体的第y条边做高能达到的最高高度,递推方程d(x,y)=max(d(i,j))+h[x][y],1<=i<=n,1<=j<=3,记忆化搜索求解
int h[101][101];
int n;
int d[101][101]={0};
void deal(int x,int y,int &min1,int &max1)
{
if(y==1)
{
max1=max(h[x][2],h[x][3]);
min1=min(h[x][2],h[x][3]);
}
if(y==2)
{
max1=max(h[x][1],h[x][3]);
min1=min(h[x][1],h[x][3]);
}
if(y==3)
{
max1=max(h[x][1],h[x][2]);
min1=min(h[x][1],h[x][2]);
}
}
int dp(int x,int y)
{
int &ans=d[x][y];
if(ans)
return ans;
int min1,max1;
deal(x,y,min1,max1);
int min2,max2;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
{
deal(i,j,min2,max2);
if((max2<max1&&min2<min1)||(max2<min1)) //是否可以放置
ans=max(ans,dp(i,j));
}
ans+=h[x][y];
return ans;
}
int main()
{
int num=0;
while(cin>>n&&n)
{
num++;
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
cin>>h[i][j];
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
ans=max(ans,dp(i,j));
cout<<"Case "<<num<<": maximum height = "<<ans<<endl;
}
return 0;
}