#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 30*6 + 20;
struct Node {
int x, y, z;
};
Node S[maxn];
int dp[maxn];
bool cmp( Node a, Node b ) {
if( a.x<b.x ) { return 1; }
else if( a.x==b.x && a.y<b.y ) { return 1; }
else { return 0; }
}
int main() {
int n;
int cnt = 0;
while( cin >> n && n ) {
memset( dp, 0, sizeof(dp) );
for(int i=0; i<n; ++i) {
int a, b, c;
cin >> a >> b >> c;
S[i*6+1].x = a; S[i*6+1].y = b; S[i*6+1].z = c;
S[i*6+2].x = a; S[i*6+2].y = c; S[i*6+2].z = b;
S[i*6+3].x = b; S[i*6+3].y = a; S[i*6+3].z = c;
S[i*6+4].x = b; S[i*6+4].y = c; S[i*6+4].z = a;
S[i*6+5].x = c; S[i*6+5].y = a; S[i*6+5].z = b;
S[i*6+6].x = c; S[i*6+6].y = b; S[i*6+6].z = a;
}
int ans = 0;
sort( S, S+6*n, cmp );
for(int i=1; i<=n*6; ++i) {
for(int j=0; j<i; ++j) {
if( S[i].x>S[j].x && S[i].y>S[j].y )
dp[i] = max( dp[i], dp[j]+S[i].z );
}
ans = max( ans, dp[i] );
}
printf("Case %d: maximum height = %d\n", ++cnt, ans);
}
return 0;
}