#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans=0;
struct st{
int c,step;
};
struct node{
int id,x;
bool operator <(const node&h)const{
return x<h.x;
}
};
vector<st>sum[1000006],cnt[1000006];
int dis[1000006];
bool flag[1000006];
void dij(int x){
priority_queue<node>q;
for(int i=1;i<=n;i++){
dis[i]=INT_MAX;
flag[i]=0;
}
dis[x]=0;
flag[x]=1;
q.push((node){x,0});
while(q.empty()==0){
int now=q.top().id;
q.pop();
for(int i=0;i<sum[now].size();i++){
int tt=sum[now][i].step,id=sum[now][i].c;
if(dis[id]>dis[now]+tt){
dis[id]=dis[now]+tt;
if(flag[id]==0){
flag[id]=1;
q.push((node){id,dis[id]});
}
}
}
}
}
void dijs(int x){
priority_queue<node>q;
for(int i=1;i<=n;i++){
dis[i]=INT_MAX;
flag[i]=0;
}
dis[x]=0;
flag[x]=1;
q.push((node){x,0});
while(q.empty()==0){
int now=q.top().id;
q.pop();
for(int i=0;i<cnt[now].size();i++){
int tt=cnt[now][i].step,id=cnt[now][i].c;
if(dis[id]>dis[now]+tt){
dis[id]=dis[now]+tt;
if(flag[id]==0){
flag[id]=1;
q.push((node){id,dis[id]});
}
}
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
sum[u].push_back((st){v,w});
cnt[v].push_back((st){u,w});
}
dij(1);
for(int i=1;i<=n;i++){
ans+=dis[i];
}
dijs(1);
for(int i=1;i<=n;i++){
ans+=dis[i];
}
cout<<ans<<endl;
return 0;
}