#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int a[20][20];
int cnt = 0,stk[1<<15], sum[20][1<<15];
int dp[20][1 << 15];
int inif();
void zuosi(int);
inline int max(int x, int y){return x > y ? x : y;}
int getsum(int i, int j, int n);
int main()
{
// freopen("1","r",stdin);
while(1)
{
memset(dp, -1 , sizeof(dp));
memset(sum, 0 ,sizeof(sum));
memset(stk, 0 , sizeof(stk));
// memset(a, 0 , sizeof(a));
int n ;
n = inif(); //初始化
if(!n)break;
zuosi(n); //找状态
for(int i=0; i < cnt; i++)
{
dp[0][i] = sum[0][i];
}
for(int i=1; i < n; i++)
{
for(int j=0; j < cnt; j++)
{
for(int k=0; k < cnt; k++)
{
if(stk[j] & stk[k] ||((stk[j] >> 1)&stk[k]) || ((stk[j])&(stk[k]>>1)) )continue;
if(dp[i-1][k] != -1)
dp[i][j] = max(dp[i-1][k]+sum[i][j], dp[i][j]);
}
}
}
int ans = 0;
for(int i=0; i < (1 << n); i++)
ans = max(ans, dp[n-1][i]);
printf("%d\n", ans);
}
}
int inif()
{
char x, y ,z;
int n = 0;
while(1)
{
if(scanf("%c%c%c", &x, &y, &z)!=3)return 0;
a[0][n] = (x-'0')*10+(y-'0');
n++;
if(z == '\n')
break;
}
for(int i=1; i < n; i++)
for(int j=0; j < n; j++)
scanf("%d", &a[i][j]);
scanf("%c%c",&x, &y );
return n;
}
void zuosi(int n)
{
cnt = 0;
for(int i=0; i < (1 << n); i++)
{
if(i & (i >> 1))continue;
stk[cnt++] = i;
for(int j = 0; j < n; j++)
sum[j][cnt-1] = getsum(i, j, n);
}
}
int getsum(int i, int j, int n)
{
int temp = 0;
int x = 0;
while(i)
{
if(i&1)
temp += a[j][n-x-1];
i = ( i >> 1);
x++;
}
return temp;
}