#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int M=1e5+5,N=1e3+5;
struct al{
int v,e;
};
bool operator <(const al &a,const al &b){
return a.e>b.e;
}
priority_queue<al> q;
al a[M];
int nxt[M],h[N],d[N],tot;
bool b[N];
void add(int x,int y,int z);
void dijkstra();
int main(){
int n,m,x[M],y[M],z[M];
scanf("%d%d",&n,&m);
for (int i=1;i<=m;++i){
scanf("%d%d%d",&x[i],&y[i],&z[i]);
add(x[i],y[i],z[i]);
}
dijkstra();
int ans=0;
for (int i=1;i<=n;++i)
ans+=d[i];
tot=0;
memset(h,0,sizeof(h));
memset(b,0,sizeof(b));
for (int i=1;i<=m;++i)
add(y[i],x[i],z[i]);
dijkstra();
for (int i=1;i<=n;++i)
ans+=d[i];
printf("%d",ans);
return 0;
}
inline void add(int x,int y,int z){
a[++tot].v=y;
a[tot].e=z;
nxt[tot]=h[x];
h[x]=tot;
}
inline void dijkstra(){
memset(d,0x3f,sizeof(d));
d[1]=0;
q.push((al){1,0});
while (q.size()){
al tmp;
tmp=q.top();
q.pop();
if (b[tmp.v])
continue;
b[tmp.v]=1;
for (int j=h[tmp.v];j;j=nxt[j])
if (d[a[j].v]>d[tmp.v]+a[j].e){
d[a[j].v]=d[tmp.v]+a[j].e;
if (!b[a[j].v])
q.push(a[j]);
}
}
}