#include<iostream>
#include<vector>
#define INF 10000000
using namespace std;
vector<vector<int> > cost;
vector<int> mincost;
int s,d;
int prim(){
	vector<bool> used(d+1,false);
	mincost[0]=0;
	int res=0;
	while(1){
		int v=-1;
		for(int u=0;u<d+1;u++){
			if(!used[u]&&(v==-1||mincost[u]<mincost[v])){
				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]);
		}
	}
	return res;
}
int main(){
	while(cin>>s>>d,s||d){
		cost=vector<vector<int> >(d+1,vector<int>(d+1,INF));
		mincost=vector<int>(d+1,INF);
		for(int i=0;i<s;i++){
			for(int j=0;j<d;j++){
				int x;
				cin>>x;
				if(!x)
				continue;
				cost[d][j]=min(cost[d][j],x);
				cost[j][d]=min(cost[d][j],x);
			}
		}
		for(int i=0;i<d-1;i++){
			for(int j=1;j<d-i;j++){
				int x;
				cin>>x;
								if(!x)
				continue;

				cost[i][i+j]=x;
				cost[i+j][i]=x;
			}
		}
		cout<<prim()<<endl;
	}
	return 0;
}