#include <stdio.h>
#include <string.h>
#include <algorithm>

int n, a[22][22];
int dp[22][1<<21];

int O(int u, int m)
{
    if (m == ((1 << (n)) - 1)) return a[u][0];
    int &d = dp[u][m];
    if (d != -1) return d;
    d = 1e9;
    for (int v = 0; v < n; ++v)
    {
        if (m & (1 << v)) continue;
        if (a[u][v] == 0) continue;
        d = std::min(d, O(v, m|(1<<v)) + a[u][v]);
    }
    return d;
}

int main()
{
    memset(dp, -1, sizeof dp);
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) scanf("%d", &a[i][j]);
    printf("%d", O(0, 1));
    return 0;
}