#include<iostream>
#include<algorithm>
#include<queue>
#define INF 10000000
using namespace std;

int n,m,a,res;
int t[100][100],u[100];
queue<int>qu;
int mincost[100],used[100];
void init(){
  for(int i=0;i<100;i++)for(int j=0;j<100;j++)t[i][j]=INF;
  for(int i=0;i<100;i++){
    mincost[i]=u[i]=INF;
    used[i]=0;
  }
}
int main(){
  while(cin>>n>>m&&n){
    init();
    for(int j=0;j<n;j++){
      for(int i=0;i<m;i++){
	cin>>a;
	if(a==0)continue;
	u[i]=min(u[i],a);
      }
    }
    for(int i=0;i<m;i++){
      t[i][m]=t[m][i]=u[i];
    }
    
    

    for(int i=0;i<m-1;i++){
      for(int j=0;j<m-1-i;j++){
	cin>>a;
	if(!a)continue;
	t[i][j+i+1]=a;
	
	t[j+i+1][i]=t[i][j+i+1];
      }
    }
    m++;
    /*
    for(int i=0;i<m;i++){
      for(int j=0;j<m;j++){
	if(t[i][j]==INF)printf("%2d ",-1);
	else printf("%2d ",t[i][j]);
      }
      cout<<endl;
    }
    */
    res=0;
    mincost[0]=0;
    while(1){
      int v=-1;
      for(int u=0;u<m;u++){
	if(!used[u]&&(v==-1||mincost[u]<mincost[v]))v=u;
      }
      if(v==-1)break;
      used[v]=1;
      res+=mincost[v];
      for(int u=0;u<m;u++){
	mincost[u]=min(mincost[u],t[v][u]);
      }
    }
    cout<<res<<endl;
  }
  return 0;
}