#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}return x*f;}
struct graph{
int k;
int v;
int w;
}edge1[2000001],edge2[2000001];
int head1[1000001],head2[1000001],vis[1000001],num,f[1000001],ans,n,m;
typedef pair<int,int> P;
void add1(int from,int to,int dis){
edge1[++num].k=head1[from];
edge1[num].v=to;
edge1[num].w=dis;
head1[from]=num;
}
void add2(int from,int to,int dis){
edge2[num].k=head2[from];
edge2[num].v=to;
edge2[num].w=dis;
head2[from]=num;
}
int dijkstra(graph g[],int h[]){//封装
int sum=0;
priority_queue<P>q;
memset(f,0x7f,sizeof f);
memset(vis,0,sizeof vis);
f[1]=0;
q.push(P(0,1));
while(!q.empty()){
P t=q.top();q.pop();
int j=t.second;
if(vis[j])continue;
vis[j]=1;
for(int i=h[j];i;i=g[i].k){
int l=g[i].v;
if(f[l]>f[j]+g[i].w){
f[l]=f[j]+g[i].w;
q.push(P(f[l],l));
}
}
}
for(int i=1;i<=n;i++)
sum+=f[i];
return sum;
}
signed main(){
n=read();m=read();
while(m--){
int a=read(),b=read(),c=read();
add1(a,b,c);add2(b,a,c);
}
ans=dijkstra(edge1,head1)+dijkstra(edge2,head2);
cout<<ans;
return 0;
}