import sys


class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n + 1))  # 顶点编号从1开始
        self.rank = [0] * (n + 1)

    def find(self, x):  # 找出x 所在集合 的根节点
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]

    def union(self, x, y):
        root_x = self.find(x)
        root_y = self.find(y)
        if self.rank[root_x] < self.rank[root_y]:
            self.parent[root_x] = root_y
        else:
            self.parent[root_y] = root_x
            if self.rank[root_x] == self.rank[root_y]:  # 深度+1
                self.rank[root_x] += 1
        return True

    def is_connected(self, x, y):
        return self.find(x) == self.find(y)


def main():
    n, m = map(int, sys.stdin.readline().split())
    edges = []
    for i in range(m):
        u, v, w = map(int, sys.stdin.readline().split())
        # 按照 u,v,w 顺序存
        edges.append((u, v, w, i + 1))  # 边的编号
    # 按照权重升序排序边 指定按照第三个元素w 排序
    edges.sort(key=lambda x: x[2])
    uf = UnionFind(n)
    total_wait = 0
    mnt_edges = []
    # 遍历排序的边构建最小生成树
    for u, v, w, idx in edges:
        if not uf.is_connected(u, v):
            if uf.union(u, v):
                total_wait += w
                #mnt_edges.append([u, v, w, idx])
                mnt_edges.append(idx)
                if len(mnt_edges) == n - 1:  # 当边数为n-1
                    break
    print(total_wait)
    print(" ".join(map(str, mnt_edges)))


main()