#include<bits/stdc++.h>

using namespace std;

const long long MaxN = 5e2 + 5;

long long n,a[MaxN];

vector<pair<long long,pair<long long,long long>>> pr;

struct DSU
{
    long long lab[MaxN];
    void init()
    {
        for (long long i=0; i<=n; i++)
        {
            lab[i]=-1;
        }
    }
    long long get_root(long long u)
    {
        if(lab[u]<0) return u;
        return lab[u]=get_root(lab[u]);
    }
    void unite(long long u , long long v)
    {
        long long x = get_root(u), y=get_root(v);
        if(x==y)
        {
            return;
        }
        if(lab[x]>lab[y]) swap(x,y);
        lab[x]+=lab[y];
        lab[y]=x;
        return;
    }
    bool check(long long u, long long v)
    {
        return get_root(u)==get_root(v);
    }
    long long get_size(long long u)
    {
        return -lab[get_root(u)];
    }
};

DSU dsu;

void input()
{
    cin>>n;

    for(long long i=1;i<=n;i++)
    {
        cin>>a[i];

        pr.push_back({a[i],{0,i}});
    }

    for(long long i=1;i<=n;i++)
    {
        for(long long j=1;j<=n;j++)
        {
            long long val;
            cin>>val;

            if(i!=j)
            {
                pr.push_back({val,{i,j}});
            }
        }
    }
}

void solve()
{
    dsu.init();

    sort(pr.begin(),pr.end());

    long long ans=0;

    for(long long i=0;i<pr.size();i++)
    {
        long long w=pr[i].first;
        long long u=pr[i].second.first;
        long long v=pr[i].second.second;
        if(u==v) continue;
        if(!dsu.check(u,v))
        {
            dsu.unite(u,v);
            ans+=w;
        }
    }

    cout<<ans;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    input();
    solve();
}