#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
int x;
int y;
int w;
}v[100];
int set[100];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int find(int x)
{
if(set[x]!=x)
{
return find(set[x]);
}
return x;
}
void Krasual(int n,int m)
{
int sum=0,i,edgenum;
for(i=1;i<=n;i++)
{
set[i]=i;
}
edgenum=0;
for(i=1;i<=m&&edgenum<n-1;i++)
{
if(find(v[i].x)!=find(v[i].y))
{
edgenum++;
sum+=v[i].w;
if(v[i].x>v[i].y)
set[v[i].x]=v[i].y;
else
set[v[i].y]=v[i].x;
}
}
cout<<sum<<endl;
}
int main()
{
int n,m,b,i,j;
cin>>n;
while(n--)
{
int a[52][52]={0};
cin>>m>>b;
if(b==0)
{
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
{
cin>>a[i][j];
}
int k=1;
for(i=1;i<=m;i++)
for(j=i+1;j<=m;j++)
{
if(a[i][j])
{
v[k].x=i;
v[k].y=j;
v[k].w=a[i][j];
k++;
}
}
sort(v+1,v+k,cmp);
Krasual(m,k-1);
}
else
{
int num=0;
for(i=1;i<=m;i++)
{
cin>>v[i].x;
cin>>v[i].y;
cin>>v[i].w;
num=(num>v[i].x)?num:v[i].x;
num=(num>v[i].y)?num:v[i].y;
}
sort(v+1,v+m+1,cmp);
Krasual(num,m);
}
}
return 0;
}