'''
n,v = map(int,input().split())
graph = [[10001]*(n+1) for _ in range(n+1)]
# 用邻接矩阵存储各边信息
for i in range(v):
x,y,z = map(int,input().split())
graph[x][y] = z
graph[y][x] = z
visit = [False] *(n+1)
minDist = [10001]*(n+1)
for i in range(1,n+1):
minval = 10002
cur = -1
for j in range(1,n+1): # 找到距离当前节点最近的点
if visit[j] == False and minDist[j] < minval:
cur = j
minval = minDist[j]
visit[cur] = True
for k in range(1,n+1): # 把与当前节点相连接的点的距离换成权重值
if visit[k] == False and graph[cur][k] < minDist[k]:
minDist[k] = graph[cur][k]
ans = 0
for i in range(2,n+1):
ans += minDist[i]
print(ans)
'''
father = []
def init(n):
global father
father = list(range(n+1))
def find(x):
if x != father[x]:
father[x] = find(father[x])
return father[x]
def join(x,y):
i = find(x)
j = find(y)
if i != j:
father[j] = i
def kruscal(edge,n):
init(n)
edge.sort(key = lambda x:x[2])
res = 0
for s,e,val in edge:
finds = find(s)
finde = find(e)
if finds != finde:
res += val
join(finds,finde)
return res
if __name__=='__main__':
n,m = map(int,input().split())
edge = []
for i in range(m):
s,e,val = map(int,input().split())
edge.append([s,e,val])
res = kruscal(edge,n)
print(res)
两种方法构造最小生成树,Prim,Kruscal方法。