/*
状压dp入门题
f[i][j]表示当前状态为i,走到第j个城市最短路径
相应的状态转移方程为f[i][j]=min( f[i^(1<<j)][k]+g[k][j]);
i^(1<<j)的意思是将j这个城市从i状态中去掉.g[k][j]是k和j之间的距离。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 50010
using namespace std;
int n,g[20][20],f[maxn][20],ans;
int min(int x,int y){return x<y?x:y;}
int main()
{
scanf("%d",&n);n--;
memset(f,127/3,sizeof(f));
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
scanf("%d",&g[i][j]);
ans=f[0][0];f[0][0]=0;
for(int i=1;i<(1<<n);i++)
for(int j=1;j<=n;j++)if(i&(1<<j-1))
for(int k=0;k<=n;k++)
f[i][j]=min(f[i][j],f[i^(1<<j-1)][k]+g[k][j]);
for(int i=1;i<=n;i++)
ans=min(ans,f[(1<<n)-1][i]+g[i][0]);
printf("%d\n",ans);
return 0;
}