spaf
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
const ll N=610000;
ll vis[21900]; //相当于bool函数
ll dis[21900],u[N],v[N],w[N];
ll nxt[N],head[N];
ll n,m;
ll cnt=0;
struct node{
ll to,next,val;
}edge[N];
void add(ll x,ll y,ll z)
{
edge[++cnt].to=y;
edge[cnt].val=z;
edge[cnt].next=head[x];
head[x]=cnt;
}
void spfa(ll s)
{
memset(vis,0,sizeof(vis));
queue<ll> q; //队列存放节点
q.push(s);
vis[s]=1; //初始值 bool标记1 距离为零 出发点
dis[s]=0;
while(!q.empty())
{
ll x=q.front(); //每次去头节点并删除 X=TOT
q.pop();
vis[x]=0; // bool返回0
for (ll i=head[x];i!=-1;i=edge[i].next) //节点对应的边
{
ll y=edge[i].to; //Y=TO
if (dis[y]>dis[x]+edge[i].val) // Y>X+VAL;
{
dis[y]=dis[x]+edge[i].val;
if (!vis[y]) // 如果节点返回0 则标记为1并放入队列;
{
vis[y]=1;
q.push(y);
}
}
}
}
}
int main()
{
ll t,i,k;
cin>>t;
while(t--)
{
ll sum=0;
cin>>n>>m;
memset(head,-1,sizeof(head)); //建造邻接表之前 初始化;
for(i=1;i<=m;i++)
{
scanf("%lld %lld %lld",&u[i],&v[i],&w[i]);
add(u[i],v[i],w[i]);
}
memset(dis,INF,sizeof(dis));
dis[1]=0;
spfa(1);
for(ll j=1;j<=n;j++)
sum+=dis[j]; //前往
//回来
cnt=0;
memset(head,-1,sizeof(head));
memset(dis,INF,sizeof(dis));
dis[1]=0;
for(i=1;i<=m;i++)
{
add(v[i],u[i],w[i]);
}
spfa(1);
for(ll j=1;j<=n;j++)
sum+=dis[j];
printf("%lld\n",sum);
}
return 0;
}