#include<stdio.h>
#include<string.h>
#define INF 1<<29
int dp[32768][15];//第一维当前状态 第二维为现在所在位置
int start[32768][15];
int bit_mask[30];
int map[16][16];
int main()
{
int n,i,j,k,newi,begin,min;
bit_mask[0]=1;
for(i=1;i<30;i++)
bit_mask[i]=bit_mask[i-1]<<1;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<bit_mask[n];i++)
for(j=0;j<n;j++)
dp[i][j]=INF;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
for(i=0;i<n;i++)
{
dp[0][i]=0;
start[0][i]=i;
}
for(i=0;i<bit_mask[n];i++)
{
for(k=0;k<n;k++)
{
for(j=0;j<n;j++)
{
if((i&bit_mask[j])==0)
{
newi=i|bit_mask[j];
if(dp[i][k]+map[k][j]<dp[newi][j])
{
dp[newi][j]=dp[i][k]+map[k][j];
start[newi][j]=start[i][k];
}
}
}
}
}
min=INF;
for(i=0;i<n;i++)
{
begin=start[bit_mask[n]-1][i];
// printf("BEGIN:%d\n",begin);
dp[bit_mask[n]-1][i]+=map[begin][i];
if(dp[bit_mask[n]-1][i]<min)
min=dp[bit_mask[n]-1][i];
}
printf("%d\n",min);
}
return 0;
}