#include<bits/stdc++.h>
using namespace std;
int A,B,s[310],n,ww[310];
struct qq{
int u,v,w;
}a[90010];
bool cmp(qq x,qq y){
return x.w<y.w;
}
int find(int x){//并查集找根节点
if(x!=s[x])s[x]=find(s[x]);
return s[x];
}
int k=1,ans=0;
void work()
{
for(int i=1;i<=n;++i)s[i]=i;
for(int i=1;i<=k;++i){
int x=find(a[i].u),y=find(a[i].v);
if(x!=y){
if(a[a[i].u].w>ww[x]+ww[x])continue;//如果连通的代价> 在两个农场挖井的代价就不连通
if(ww[x]>ww[y])
s[x]=y;
else s[y]=x;//将一个集合中挖井代价最小的农场当做当做根结点
ans+=a[i].w;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)cin>>ww[i];
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
int w;
cin>>w;
if(i>=j)continue;
else {
a[k].w=w;
a[k].u=i;
a[k].v=j;
}
k++;
}
k--;
sort(a+1,a+1+k,cmp);
work();
for(int i=1;i<=n;++i){
if(s[i]==i)ans+=ww[i];//将每一个根节点的代价累加
}
cout<<ans;
}