#include "bits/stdc++.h"
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int N = 1e6+5;
ll t,P,Q,cnt,u[N],v[N],w[N];
ll head[N],ans[N],vis[N];
struct node{
ll to,next,w;
}edge[N],l[N];
struct cmp{
bool operator()(pair<ll,ll>a,pair<ll,ll>b){
return a.first>b.first;
}
};
void init(){
cnt=0;
memset(head,-1,sizeof head);
for(ll i=1 ;i<=P;i++){
ans[i]=inf;
vis[i]=0;
}
}
void add_edge(ll u,ll v , ll w){
edge[cnt].w=w;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void djstl(ll x){
priority_queue<pair<int,int>,vector<pair<int,int>>,cmp>q;
ans[x]=0;
q.push({0,x});
while(!q.empty())
{
ll p = q.top().second;
q.pop();
vis[p]=1;
for( ll i = head[p] ; i!= -1 ;i=edge[i].next)
{
if(vis[edge[i].to] == 0 && ans[edge[i].to] > ans[p] + edge[i].w){
ans[edge[i].to] = ans[p] + edge[i].w;
q.push({ans[edge[i].to],edge[i].to});
}
}
}
}
int main()
{
while (~scanf("%d",&t)){
while (t--)
{
scanf("%d%d",&P,&Q);
init();
for(ll i=1 ;i<=Q ;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
add_edge(u[i],v[i],w[i]);
}
ll sum = 0;
djstl(1);
for(int i=2 ;i<=P;i++){
sum+=ans[i];
}
init();
for(ll i=1 ;i<=Q ;i++)
{
add_edge(v[i],u[i],w[i]);
}
djstl(1);
for(int i=2 ; i<=P;i++){
sum+=ans[i];
}
printf("%d\n",sum);
}
}
return 0;
}
//写的很无语 不会用memcpy
题目的意思就是 1到所有点的距离 ,所有点到1的距离,求最短路 ,代码写的是先跑1到所有点的距离,然后在原先跑存的时候在存逆着跑的图,跑完正再跑逆着,结束