1 #include<bits/stdc++.h>
2 #define INF 0x7fffffff
3 using namespace std;
4 const int MAXN = 50010;//点数
5 const int MAXM = 100100;//边数
6 struct Edge {
7 int to,next,val;
8 }edge[MAXM];
9 int head[MAXN],tot,a,b;
10 int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值是1~scc
11 int Index,top; int scc;//强连通分量的个数
12 int in[MAXN],out[MAXN],val[MAXN],d[MAXN];
13 bool Instack[MAXN];
14 int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc //num数组不一定需要,结合实际情况
15 int cnt=0,ans=0;
16 void addedge(int u,int v,int w){
17 edge[tot].to = v;
18 edge[tot].next = head[u];
19 edge[tot].val=w;
20 head[u] = tot++;
21 }
22 void Tarjan(int u){
23 int v;
24 Low[u] = DFN[u] = ++Index;
25 Stack[top++] = u;
26 Instack[u] = true;
27 for(int i = head[u];i != -1;i = edge[i].next) {
28 v = edge[i].to;
29 if( !DFN[v] ){
30 Tarjan(v);
31 if( Low[u] > Low[v] )
32 Low[u] = Low[v];
33 }
34 else if(Instack[v] && Low[u] > DFN[v])
35 Low[u] = DFN[v];
36 }
37 if(Low[u] == DFN[u]){
38 scc++;
39 do{
40 v = Stack[--top];
41 Instack[v] = false;
42 Belong[v] = scc;
43 num[scc]++;
44 }while( v != u);
45 }
46 }
47 void find_val(int u){
48 int v;
49 for(int i = head[u];i != -1;i = edge[i].next){
50 v = edge[i].to;
51 if(Belong[u]==Belong[v]) continue;
52 val[Belong[v]]=min(val[Belong[v]],edge[i].val);
53 //out[Belong[u]]++;
54 }
55 }
56 void solve(int N){
57 memset(DFN,0,sizeof(DFN));
58 memset(Instack,false,sizeof(Instack));
59 memset(num,0,sizeof(num));
60 Index = scc = top = 0;
61 for(int i=1;i<=N;i++) val[i]=INF;
62 for(int i = 1;i <= N;i++)
63 if(!DFN[i])
64 Tarjan(i);
65 for(int i=1;i<=N;i++){
66 // val[Belong[i]]=min(val[Belong[i]],d[i]);
67 find_val(i);
68 }
69 val[Belong[1]]=0;
70 for(int i=1;i<=scc;i++){
71 ans+=val[i];
72 }
73 }
74 void init(){
75 tot = 0;
76 cnt=0,ans=0;
77 memset(head,-1,sizeof(head));
78 memset(in,0,sizeof(in));
79 memset(out,0,sizeof(out));
80 }
81 int main(){
82 int n,m,u,v,w,T;
83 while(scanf("%d%d",&n,&m)!=EOF){
84 init();
85 //for(int i=1;i<=n;i++) scanf("%d",&d[i]);
86 for(int i=1;i<=m;i++){
87 scanf("%d%d%d",&u,&v,&w);
88 u++,v++;
89 addedge(u,v,w);
90 }
91 solve(n);
92 cout<<ans<<endl;
93 //cout<<cnt<<' '<<ans<<endl;
94 }
95 return 0;
96 }