#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <climits>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#define ALL(A)		(A).begin(),(A).end()
#define DUMP(A)    cout<<#A<<"="<<(A)<< endl
#define SIZE(A)    (int)((A).size())
using namespace std;
typedef long long ll;

int find(int a,vector<int> &par){
    if(par[a]==a) return a;
    else return par[a]=find(par[a],par);
}
void unite(int a,int b,vector<int> &par){
    int pa=find(a,par),pb=find(b,par);
    par[pa]=pb;
}

int main(){
    for(;;){
        int s,d;
        scanf("%d%d",&s,&d);
        if(s==0&&d==0) break;
        int path[51][51];
        for(int i=0;i<d+1;i++){
            for(int j=0;j<d+1;j++){
                path[i][j]=100000;
            }
        }
        for(int i=0;i<s;i++){
            for(int j=0;j<d;j++){
                int dist;
                scanf("%d",&dist);
                if(dist!=0 && dist<path[j][d]){
                    path[j][d]=path[d][j]=dist;
                }
            }
        }
        for(int i=0;i<d;i++){
            for(int j=i+1;j<d;j++){
                int dist;
                scanf("%d",&dist);
                if(dist!=0 && dist<path[i][j]){
                    path[i][j]=path[j][i]=dist;
                }
            }
        }
        vector<pair<int,pair<int,int> > > edge;
        for(int i=0;i<d+1;i++){
            for(int j=0;j<d+1;j++){
                if(path[i][j]!=100000){
                    edge.push_back(make_pair(path[i][j],make_pair(i,j)));
                }
            }
        }
        sort(ALL(edge));
        vector<int> par(d+1);
        for(int i=0;i<d+1;i++){
            par[i]=i;
        }
        int sum=0;
        for(int i=0;i<edge.size();i++){
            int di=edge[i].first,fr=edge[i].second.first,to=edge[i].second.second;
            if(find(fr,par)!=find(to,par)){
                sum+=di;
                unite(fr,to,par);
            }
        }
        printf("%d\n",sum);
    }
}