import sys from collections import deque def main(): input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 M = int(input[ptr]) ptr += 1 edges = [[] for _ in range(N + 1)] all_chars = set() for i in range(M): a = int(input[ptr]) ptr += 1 b = int(input[ptr]) ptr += 1 c = input[ptr] ptr += 1 edges[a].append((b, c, i + 1)) edges[b].append((a, c, i + 1)) all_chars.add(c) if len(all_chars) == 1: print(-1) return visited = {} queue = deque() queue.append((1, None)) visited[(1, None)] = (None, None, None) while queue: u, fc = queue.popleft() for v, c, idx in edges[u]: new_fc = fc if fc is None: new_fc = c key = (v, new_fc) if key not in visited: visited[key] = (u, fc, idx) queue.append(key) for u in range(1, N + 1): for v, c, idx in edges[u]: if v == N: current_u = u target_c = c found = False for key in visited: if key[0] == current_u and key[1] is not None and key[1] != target_c: fc_u = key[1] path = [] current_node, current_fc = current_u, key[1] edge_list = [] while True: parent_info = visited.get((current_node, current_fc), None) if parent_info is None: break parent_node, parent_fc, edge_idx = parent_info if edge_idx is None: break edge_list.append(edge_idx) current_node, current_fc = parent_node, parent_fc edge_list.reverse() edge_list.append(idx) if len(edge_list) > 2 * N: continue print(len(edge_list)) for e in edge_list: print(e) return print(-1) if __name__ == "__main__": main()