#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int dis[100005],vis[100005];
struct edge
{
int v,w;
};
struct node
{
int dis,u;
bool operator<(const node& a) const {return dis>a.dis;}
};
vector<edge> e[100005];
priority_queue<node>pq;
void dijkstra(int n,int s)
{
for(int i=1;i<=n*2;i++)
dis[i]=1e9,vis[i]=false;
dis[s]=0;
pq.push((node){0,s});
while(!pq.empty())
{
int u=pq.top().u;
pq.pop();
if(vis[u])
continue;
vis[u]=true;
for(int j=0;j<e[u].size();j++)
{
edge ed=e[u][j];
int v=ed.v,w=ed.w;
if(dis[v]>dis[u]+w)
dis[v]=dis[u]+w,pq.push((node){dis[v],v});
}
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
e[u].push_back((edge){v,w});
e[u+n].push_back((edge){v+n,w});
}
long long ans=0;
dijkstra(n,1);
for(int i=2;i<=n;i++)
ans+=dis[i];
dijkstra(n,1+n);
for(int i=2+n;i<=n*2;i++)
ans+=dis[i];
cout<<ans<<endl;
return 0;
}
样例 output 56