#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
long long n,m,edgenum,ans;
long long head[200005],vet[200005],wei[200005],nex[200005],dis[200005];
struct nod
{
int x;
int dis;
bool operator <(const nod a)const
{
return this->dis>a.dis;
}
};
priority_queue< nod ,vector<nod>,greater<nod>>q;
void dij(int t)
{
for(int i=1;i<=n*2;i++)dis[i]=10000000007;
dis[t]=0;
q.push(nod(t,0));
while(!q.empty())
{
nod c=q.top();q.pop();
for(int i= head[c.x];~i;i=nex[i])
{
while(dis[vet[i]]>c.dis+wei[i])
{
dis[vet[i]]=c.dis+wei[i];
q.push(nod(vet[i],dis[vet[i]]))
}
}
}
}
void add(int u,int v,int w)
{
edgenum++;
head[u]=edgenum;
vet[edgenum]=v;
wei[edgenum]=w;
nex[edgenum]=head[u];
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v+n,u+n,w);
}
dij(1);
for(int i=1;i<=n;i++)
ans+=dis[i];
dis(n+1);
for(int i=n+1;i<=2*n;i++)
ans+=dis[i];
printf("%d",ans);
return 0;
}