class UnionFind: def __init__(self, size): self.parent = list(range(size + 1)) # 1-based indexing self.size = [1] * (size + 1) def find(self, x): while self.parent[x] != x: self.parent[x] = self.parent[self.parent[x]] # Path compression x = self.parent[x] return x def union(self, x, y): fx = self.find(x) fy = self.find(y) if fx == fy: return False # Union by size: attach smaller tree to larger tree if self.size[fx] < self.size[fy]: fx, fy = fy, fx self.parent[fy] = fx self.size[fx] += self.size[fy] return True def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 M = int(input[ptr]) ptr += 1 edges = [] for _ in range(M): a = int(input[ptr]) ptr += 1 b = int(input[ptr]) ptr += 1 w = int(input[ptr]) ptr += 1 edges.append((w, a, b)) edges.sort() uf = UnionFind(N) total = 0 for w, a, b in edges: fa = uf.find(a) fb = uf.find(b) if fa != fb: total += w * uf.size[fa] * uf.size[fb] uf.union(a, b) print(total) if __name__ == "__main__": main()