#include <iostream>
#include <vector>
using namespace std;

int solve(vector<vector<int>> & dp, int i, int S, const vector<vector<int>> & d, int n)
{
  if (dp[i][S] >= 0)
    return dp[i][S];
  int res = 300000;
  for (int j = 0; j < n - 1; j++)
  {
    if (! (S >> j & 1))
      res = min(res, d[i][j + 1] + solve(dp, j + 1, S | (1 << j), d, n));
  }
  dp[i][S] = res;
  return res;
}

int main()
{
  int n;
  cin >> n;
  vector<vector<int> > d(n, vector<int>(n));
  for (int i = 0; i <n; i++)
  {
    for (int j = 0; j < n; j++)
      cin >> d[i][j];
  }
  vector<vector<int> > dp(n, vector<int> (1<<(n - 1), -1));
  // dp[i][S]: having visited S, starting from i, the shortest distance travelled to visit the remaining cities and then back to city 0.  
  // Convention: S does not include city 0; the lowest bit of S represents city 1
  for (int i = 0; i < n; i++)
    dp[i][(1 << (n - 1)) - 1] = d[i][0];
  
  cout << solve(dp, 0, 0, d, n);
  return 0;
}
