#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
const long long INF = 1e10+10;
int n,m;
long long cost[1005][1005];
long long d[1005];
bool used[1005];
long long sum = 0;
void Dijkstra(){ // 最短路算法
for(int i = 1 ; i <= n ; i++){
used[i] = false;
d[i] = INF;
}
d[1] = 0;
while(true){
int v = -1;
for(int i = 1 ; i <= n ; i++){
if(!used[i] && (v == -1 || d[i] < d[v])){
v = i;
}
}
if(v == -1){
break;
}
used[v] = true;
for(int i = 1 ; i <= n ; i++){
d[i] = min(d[i] , d[v] + cost[v][i]);
}
}
for(int i = 1 ; i <= n ; i++){ //每一次将对于每个点的最短距离累加;
sum += d[i];
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
if(i == j){
cost[i][j] = 0;
}else{
cost[i][j] = INF;
}
}
}
for(int i = 1 ; i <= m ; i++){
int a,b;
long long c;
scanf("%d%d%lld",&a,&b,&c);
cost[a][b] = c;
}
Dijkstra();
for(int i = 1 ; i <= n ; i++){ //矩阵转置
for(int j = i+1 ; j <= n ; j++){
swap(cost[i][j], cost[j][i]);
}
}
Dijkstra();
printf("%lld\n",sum);
return 0;
}