
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int N = 505;
struct node
{
int v, w;
};
int n, m;
vector<node> g[N];
int dis[N];
bool vis[N];
int prim(int st)
{
memset(dis, 0x3f, sizeof(dis));
dis[st] = 0;
int sum = 0;
for(int i = 1; i <= m; i++)
{
int k = 0;
for(int j = 1; j <= m; j++)
{
if(!vis[j] && dis[j] < dis[k])
{
k = j;
}
}
if(k == 0) return 0;
vis[k] = 1;
sum += dis[k];
for(int j = 0; j < g[k].size(); j++)
{
int v = g[k][j].v;
int w = g[k][j].w;
if(!vis[v] && w < dis[v])
{
dis[v] = w;
}
}
}
return sum;
}
int main()
{
cin >> n >> m;
int i;
int u, v, w;
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> w;
if(w == 0) w = n;
g[i].push_back(node{j, w});
}
}
int s = prim(1);
cout << s << endl;
return 0;
}