#include<bits/stdc++.h>
using namespace std;
const int N=100005,inf=2147483647;
int n,m;
long long to1[N],val1[N],h1[N],nxt1[N],cnt1,vis1[N],dis1[N];
long long to2[N],val2[N],h2[N],nxt2[N],cnt2,vis2[N],dis2[N];
void add1(int a,int b,int c){
to1[++cnt1]=b;
val1[cnt1]=c;
nxt1[cnt1]=h1[a];
h1[a]=cnt1;
}
void add2(int a,int b,int c){
to2[++cnt2]=b;
val2[cnt2]=c;
nxt2[cnt2]=h2[a];
h2[a]=cnt2;
}
struct node{
long long v,w;
friend bool operator<(node a,node b){
return a.w>b.w;
}
};
priority_queue<node> q;
void Dijkstra1(){
for(int i=2;i<=n;i++) dis1[i]=inf;
node tmp;
tmp.v=1; tmp.w=0; q.push(tmp);
while(!q.empty()){
int u=q.top().v; q.pop();
if(vis1[u]) continue;
vis1[u]=1;
for(int i=h1[u];i;i=nxt1[i]){
if(dis1[to1[i]]>dis1[u]+val1[i]){
dis1[to1[i]]=dis1[u]+val1[i];
tmp.v=to1[i]; tmp.w=dis1[to1[i]]; q.push(tmp);
}
}
}
}
void Dijkstra2(){
for(int i=2;i<=n;i++) dis2[i]=inf;
node tmp;
tmp.v=1; tmp.w=0; q.push(tmp);
while(!q.empty()){
int u=q.top().v; q.pop();
if(vis2[u]) continue;
vis2[u]=1;
for(int i=h2[u];i;i=nxt2[i]){
if(dis2[to2[i]]>dis2[u]+val2[i]){
dis2[to2[i]]=dis2[u]+val2[i];
tmp.v=to2[i]; tmp.w=dis2[to2[i]]; q.push(tmp);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1,u,v,w;i<=m;i++){
cin>>u>>v>>w;
add1(u,v,w);
add2(v,u,w);
}
Dijkstra1();
Dijkstra2();
long long ans;
for(int i=2;i<=n;i++) ans+=dis1[i]+dis2[i];
cout<<ans;
return 0;
}