原题网址:http://www.lydsy.com/JudgeOnline/problem.php?id=1232
题解:最小生成树,边权是原边权两倍加上两端点权。最后加上点权最小的点的点权(出发点)。
var
a,fa:array[0..10050] of longint;
x,y,v:array[0..100050] of longint;
n,m,i,f1,f2:longint;
ans:int64;
procedure swap(var a,b:longint);
var t:longint;
begin t:=a;a:=b;b:=t;end;
procedure sort(l,r:longint);
var
i,j,e:longint;
begin
i:=l;j:=r;e:=v[(l+r)>>1];
repeat
while v[i]<e do inc(i);
while e<v[j] do dec(j);
if not (i>j) then
begin
swap(x[i],x[j]);
swap(y[i],y[j]);
swap(v[i],v[j]);
inc(i);dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
function find(x:longint):longint;
begin
if (fa[x]=x) then exit(x);
fa[x]:=find(fa[x]);
exit(fa[x]);
end;
begin
read(n,m);
ans:=maxlongint;
for i:=1 to n do read(a[i]);
for i:=1 to n do
if (a[i]<ans)
then ans:=a[i];
for i:=1 to m do
begin
read(x[i],y[i],v[i]);
v[i]:=v[i]<<1+a[x[i]]+a[y[i]];
end;
sort(1,m);
for i:=1 to n do fa[i]:=i;
for i:=1 to m do
begin
f1:=find(x[i]);
f2:=find(y[i]);
if (f1<>f2) then
begin
inc(ans,v[i]);
fa[f1]:=f2;
end;
end;
writeln(ans);
end.