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

#define int long long

const long long INF = 1e18;

int n;
vector<int> start_state;
vector<vector<int>> C;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;

    start_state.resize(n);
    for (int i = 0; i < n; i++) cin >> start_state[i];

    C.assign(n, vector<int>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> C[i][j];
        }
    }

    vector<int> target = start_state;
    sort(target.begin(), target.end());

    map<vector<int>, long long> dist;

    priority_queue<
        pair<long long, vector<int>>,
        vector<pair<long long, vector<int>>>,
        greater<pair<long long, vector<int>>>
    > pq;

    dist[start_state] = 0;
    pq.push({0, start_state});

    while (!pq.empty()) {
        auto [d, cur] = pq.top();
        pq.pop();

        if (d != dist[cur]) continue;

        if (cur == target) {
            cout << d << '\n';
            return 0;
        }

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {

                vector<int> nxt = cur;
                swap(nxt[i], nxt[j]);

                long long nd = d + C[i][j];

                if (!dist.count(nxt) || nd < dist[nxt]) {
                    dist[nxt] = nd;
                    pq.push({nd, nxt});
                }
            }
        }
    }

    return 0;
}