这个题目的意思便是求两遍最短路~
Const maxn=1000100;
Var
sa,sb,se,a,b,e,f,q:array[1..maxn*2]of int64;
vis:array[1..maxn*2]of boolean;
dis:array[1..maxn*2]of int64;
n,m,k,i,j:longint;
sum:qword;
Procedure init;
var i:longint;
begin
readln(n,m);
for i:=1 to m do readln(sa[i],sb[i],se[i]);
end;
Procedure qsort(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;j:=r;x:=a[(l+r)shr 1];
Repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
y:=a[i];a[i]:=a[j];a[j]:=y;
y:=b[i];b[i]:=b[j];b[j]:=y;
y:=e[i];e[i]:=e[j];e[j]:=y;
inc(i);dec(j);
end;
Until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
Procedure prepare1;
begin
a:=sa; b:=sb; e:=se;
end;
Procedure prepare2;
begin
a:=sb; b:=sa; e:=se;
end;
Procedure spfainit;
var i:longint;
begin
fillchar(f,sizeof(f),0);
for i:=1 to m do if f[a[i]]=0 then f[a[i]]:=i;
f[n+1]:=m+1;
for i:=n downto 1 do if f[i]=0 then f[i]:=f[i+1]; fillchar(vis,sizeof(vis),false);
for i:=1 to n*2 do dis[i]:=maxlongint*maxlongint;
end;
Procedure spfa(st:longint);
var head,tail,i,j,k:longint;
begin
spfainit;
head:=0;tail:=1;vis[st]:=true;q[1]:=st; dis[st]:=0;
while head<>tail do
begin
inc(head);
if head>maxn then head:=1;
k:=q[head];
for i:=f[k] to f[k+1]-1 do if dis[k]+e[i]<dis[b[i]] then
begin
dis[b[i]]:=dis[k]+e[i];
if not vis[b[i]] then
begin
inc(tail);
if tail>maxn then tail:=1;
q[tail]:=b[i];
vis[b[i]]:=true;
end;
end;
vis[k]:=false;
end;
end;
Begin
readln(k);
for j:=1 to k do
begin
init;
prepare1;
qsort(1,m);
spfa(1);
sum:=0;
for i:=1 to n do inc(sum,dis[i]);
prepare2;
qsort(1,m);
spfa(1);
for i:=1 to n do inc(sum,dis[i]);
writeln(sum);
end;
End.