class DisjointsetUnionFind: def __init__(self, N: int): self.number = N self.parent = [ -1 for _ in range(self.number + 1)] self.size = [ 1 for _ in range(self.number + 1)] def rootsearch(self, x): while True: if self.parent[x] == -1: break else: x = self.parent[x] return x def leader_size(self, v : int): return self.size[self.rootsearch(v)] def union(self, u: int, v: int): ru = self.rootsearch(u) rv = self.rootsearch(v) if ru != rv: if self.size[ru] < self.size[rv]: self.parent[ru] = rv self.size[rv] += self.size[ru] else: self.parent[rv] = ru self.size[ru] += self.size[rv] def issame(self, u: int, v: int): return self.rootsearch(u) == self.rootsearch(v) N, M = list(map(int,input().split())) Vertex_list = list() for i in range(M): a, b, w = list(map(int,input().split())) Vertex_list.append([a - 1, b - 1, w]) Vertex_list.sort(key = lambda x : -x[2]) uf = DisjointsetUnionFind(N) union_size = 1 answer = 0 while union_size < N: p = Vertex_list.pop() if not uf.issame(p[0], p[1]): answer += uf.leader_size(p[0]) * uf.leader_size(p[1]) * p[2] uf.union(p[0], p[1]) union_size += 1 print(answer)