using System;
using System.Collections.Generic;
using System.Text;

class TEST{
	static void Main(){
		while(true){
			var d=Array.ConvertAll(Console.ReadLine().Split(new char[2]{' ','\t'}),elem=>int.Parse(elem));
			if(d[0]==0 && d[1]==0)break;
			Sol mySol=new Sol(d[0],d[1]);
			Console.WriteLine(mySol.Ans);
		}
	}
}



class Sol{
	int ans;
	public int Ans{
		get{return ans;}
	}
	
	int s,d;
	int[,] D_Spring;
	int[,] D_District;
	public Sol(int sin,int din){
		s=sin;d=din;
		D_Spring=new int[s,d];
		for(int i=0;i<s;i++){
			var ss=Console.ReadLine().Split(new char[2]{' ','\t'});
			for(int j=0;j<d;j++)D_Spring[i,j]=int.Parse(ss[j]);
		}
		D_District=new int[d,d];
		for(int i=0;i<d;i++)D_District[i,i]=0;
		for(int i=0;i<d-1;i++){
			var ss=Console.ReadLine().Split(new char[2]{' ','\t'});
			for(int j=i+1;j<d;j++){
				D_District[i,j]=D_District[j,i]=int.Parse(ss[j-(i+1)]);
			}
		}
		
		Dijkstra();
	}
	
	void Dijkstra(){
		bool[] isFixed=new bool[d];
		for(int i=0;i<d;i++)isFixed[i]=false;

		int[] score=new int[d];
		
		//init
		for(int i=0;i<d;i++){
			int min=999;
			for(int j=0;j<s;j++){
				if(D_Spring[j,i]>0 && D_Spring[j,i]<min)min=D_Spring[j,i];
			}
			score[i]=min;
		}
		
		//dijkstra
		for(int i=0;i<d;i++){
			int min;
			int jmin=0;
			min=999;
			for(int j=0;j<d;j++){
				if(isFixed[j]==false && score[j]<min){
					jmin=j;
					min=score[j];
				}
			}
			isFixed[jmin]=true;
			
			for(int j=0;j<d;j++){
				if(isFixed[j]==true && D_District[j,jmin]>0 && D_District[j,jmin]<min){
					min=D_District[j,jmin];
				}
			}
			
			score[jmin]=min;
		}
		
		int sum=0;
		for(int i=0;i<d;i++)sum+=score[i];
		ans=sum;
	}
}