#include<bits/stdc++.h>
using namespace std;
int head[20000006],num,ans[10000005],vis[10000006],anss[10000005],viss[10000005],headd[10000005],numm;
struct noo
{
int from,to,dis,nixt;
}e[40000005],a[40000008];
void edg(int f,int t,int dis)
{
e[++num].nixt=head[f];
e[num].dis=dis;
e[num].from =f;
e[num].to=t;
head[f]=num;
};
void adg(int ff,int tt,int diss)
{
a[++numm].nixt=headd[ff];
a[numm].dis=diss;
a[numm].from =ff;
a[numm].to=tt;
headd[ff]=numm;
};
struct node
{
int ss,dd;
bool operator<(const node & x)const
{
return x.ss<ss;
}
};
priority_queue<node> q;
priority_queue<node> qq;
int n,m,s;
int main()
{
cin>>n>>m;
s=1;
memset(ans,0x3f3f3f3f,sizeof(ans));
for(int i=1;i<=m;i++)
{
int aa,b,c;
scanf("%d%d%d",&aa,&b,&c);
edg(aa,b,c);
adg(b,aa,c);
}
q.push((node){0,s});
ans[s]=0;
while(q.empty()!=1)
{
node dang=q.top();
q.pop();
int ddd=dang.dd,sss=dang.ss;
if(vis[ddd]==1)
continue;
vis[ddd]=1;
for(int i=head[ddd];i;i=e[i].nixt)
{
int tt=e[i].to;
if(vis[tt]==0&&ans[ddd]+e[i].dis<ans[tt])
{
ans[tt]=ans[ddd]+e[i].dis;
q.push((node){ans[tt],tt});
}
}
}
priority_queue<node> qq;
memset(anss,0x3f3f3f3f,sizeof(anss));
qq.push((node){0,s});
anss[s]=0;
while(qq.empty()!=1)
{
node dang=qq.top();
qq.pop();
int ddd=dang.dd,sss=dang.ss;
if(viss[ddd]==1)
continue;
viss[ddd]=1;
for(int i=headd[ddd];i;i=a[i].nixt)
{
int ttt=a[i].to;
if(viss[ttt]==0&&anss[ddd]+a[i].dis<anss[ttt])
{
anss[ttt]=anss[ddd]+a[i].dis;
qq.push((node){anss[ttt],ttt});
}
//cout<<endl;
}
//cout<<endl;
}
int ananan;
for(int i=1;i<=n;i++)
{
//cout<<anss[i]<<endl;
ananan+=ans[i]+anss[i];
}
cout<<ananan<<endl;
return 0;
}