#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define mp push_back
int T;
int n,m;
int g[110][110];
int d[110];
bool in[110];
bool used[110][110];
int maxe[110][110];
int pre[110];
int main()
{
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&T);
while(T --)
{
scanf("%d%d",&n,&m);
memset(g,0x3f3f3f3f,sizeof(g));
for(int i=0;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u --;
v --;
g[u][v] = g[v][u] = w;
}
int mst = 0;
//init d
memset(d,0x3f3f3f3f,sizeof(d));
//init in
memset(in,0,sizeof(in));
//init used
memset(used,0,sizeof(used));
memset(maxe,0,sizeof(maxe));
for(int i=0;i<n;i++) pre[i] = i;
d[0] = 0;
for(int i=0;i<n;i++)
{
int mins = 0x3f3f3f3f;
int p = -1;
for(int j=0;j<n;j++)
{
if(!in[j] && d[j] < mins)
{
mins = d[j];
p = j;
}
}
for(int j=0;j<n;j++)
{
if(in[j])
{
maxe[j][p] = maxe[p][j] = max(maxe[pre[p]][j],d[p]);
}
}
in[p] = true;
<span style="white-space:pre"> </span> used[pre[p]][p] = true;
mst += d[p];
for(int j=0;j<n;j++)
{
if(!in[j] && d[j] > g[j][p])
{
d[j] = g[p][j];
pre[j] = p;
}
}
}
int ans = 0x3f3f3f3f;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(!used[i][j] && g[i][j] != 0x3f3f3f3f)
{
ans = min(ans,mst-maxe[i][j]+g[i][j]);
}
}
}
printf("%d %d\n",mst,ans);
}
return 0;
}