#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <map>
#include <sstream>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iterator>
#include <stack>
#include <list>
using namespace std;
#define INF 1000000000
typedef long long int lli;
typedef pair<int,int> P;

int mincost[51];
int cost[51][51];
bool used[51];
int g[51];

int main(){
	int s,d;
	while(cin>>s>>d){
		if(s==0&&d==0) break;
		for(int i=0; i<=d; ++i){
			mincost[i]=INF;
			used[i]=false;
			g[i]=INF;
			for(int j=0; j<=d; ++j){
				if(i!=j)cost[i][j]=INF;
				else cost[i][j]=0;
			}
		}
		for(int i=0; i<s; ++i){
			for(int j=0; j<d; ++j){
				int tmp;
				cin >> tmp;
				if(tmp!=0){
					g[j]=min(g[j],tmp);
				}
			}
		}
		for(int i=0; i<d; ++i){
			cost[i][d]=cost[d][i]=g[i];
		}
		for(int i=0; i<d; ++i){
			for(int j=i+1; j<d; ++j){
				int tmp;
				cin >> tmp;
				if(tmp!=0) cost[i][j]=cost[j][i]=tmp;
			}
		}
		mincost[0]=0;
		int res=0;
		while(true){
			int v=-1;
			for(int u=0; u<d+1; ++u){
				if(!used[u]&&(v==-1||mincost[v]>mincost[u])) v=u;
			}
			if(v==-1) break;
			used[v]=true;
			res+=mincost[v];
			for(int u=0; u<d+1; ++u){
				mincost[u]=min(mincost[u],cost[v][u]);
			}
		}
		cout << res << "\n";
	}
	return 0;
}