//https://tinyurl.com/bdh8678a


include<bits/stdc++.h>
using namespace std;

vector<vector<int>>dp;
vector<vector<int>>dist; // adjacent matrix.
int n; // Number of Nodes.
int call(int S,int i){
    //All the nodes have been visited exactly once.

    if(S==((1<<n)-1)){
        return dist[i][1];
    }

    // Subtree has been calculated.
    if(dp[S][i]!=-1) return dp[S][i];

    // Go to next unvisited node.
    int res = INT_MAX;
    for(int j=0;j<n;j++){
        if((S&(1<<j))==0){ // if j'th node is unvisited.
            res = min(res , dist[i][j]+call(S|(1<<j),j)); // mark j'th node as visited.
        }
    }
    return dp[S][i] = res;
}
int main(){
    cin>>n;
    dist.resize(n,vector<int>(n));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>dist[i][j];
        }
    }
    dp.resize(1<<n,vector<int>(n,-1));
    cout<< call(1,1)<<endl;

}
/*
4
0 10 15 20
10 0 25 25
15 25 0 30
20 25 30 0
Output: 80
*/