#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bitset>
#define ll long long int
using namespace std;
int n,dis[16][16],f[16][1<<16];
//走到第I个城市 状态为J所花费的最小时间。
int main(){
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(f,0x3f3f3f3f,sizeof(f));
scanf("%d",&n);
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
scanf("%d",&dis[i][j]);
//if(i==j)dis[i][j]=0x3f3f3f3f;
}
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
f[0][0]=0;
for(int i=1;i<(1<<(n+1));i++)//枚举状态
{
for(int j=0;j<=n;j++)//枚举目标城市
{
if((i|(1<<j))==i)//目标城市走过
for(int k=0;k<=n;k++)//枚举之前城市
{
//如果走过
f[j][i]=min(f[j][i],f[k][i-(1<<j)]+dis[k][j]);
//如果没走过
f[j][i]=min(f[j][i],f[k][i]+dis[k][j]);
}
}
}
printf("%d",f[0][(1<<(n+1))-1]);
return 0;
}