#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,e[20][20];
int f[70010][20];//f[state][now]表示每个人是否被传递的状态是state,物品在now的手上的时候,最小的总代价。
int min(int a,int b) {
if(a==-1) return b;
if(b==-1) return a;
return a>b ? b:a;
}
int main() {
scanf("%d",&n);
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&e[i][j]);
memset(f,-1,sizeof(f));
for(int i=0; i<n; i++) //dp[1<<i][i]=0;表示一开始物品在i手中
f[1<<i][i]=0;
int ans=-1;
for(int i=0; i< 1<<n; i++) //枚举第i个人状态
for(int j=0; j<n; j++) //第j个人接到
if(f[i][j]!=-1)
for(int k=0; k<n; k++) //第k个人传过来
if(!(i & (1<<k) )) {
f[i | (1<<k)][k] = min(f[i | (1<<k)][k],f[i][j]+e[j][k]);
if((i | (1<<k))==(1<<n)-1) ans=min(ans,f[i|(1<<k)][k]);
}
if(ans!=-1) printf("%d\n",ans);
else printf("0\n");
return 0;
}