rt
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <memory>
#include <string>
#include <cstring>
#include <iostream>
#include <queue>
#define ll long long
using namespace std;
int a,b,head[505],cnt,f[505],ans,k;
struct node{
int to,nxt,wei;
}e[1234567];
void addedge(int u,int v,int w){
e[++cnt].to=u;
e[cnt].wei=w;
e[cnt].nxt=v;
//head[u]=cnt;
}
bool cmp(node a,node b){
return a.wei<b.wei;
}
int find(int x){
if(x==f[x]) return x;
return f[x]=find(f[x]);
}
void kruskal(){
int aa,bb;
k=0;
for(int i=1;i<=cnt;i++){
if(k==(b-1)) return;
aa=find(e[i].to);
bb=find(e[i].nxt);
if(aa!=bb){
f[aa]=bb;
ans+=e[i].wei;
k++;
}
}
return;
}
int main(){
//freopen("binary.in","r",stdin);
//freopen("binary.out","w",stdout);
cin>>a>>b;
int p;
for(int i=1;i<=b;i++)
for(int j=1;j<=b;j++){
cin>>p;
if(i<j&&p)
addedge(i,j,p);
}
for(int i=1;i<=b;i++)
addedge(0,i,a);
for(int i=0;i<=b;i++)
f[i]=i;
sort(e+1,e+cnt+1,cmp);
kruskal();
cout<<ans<<endl;
return 0;
}