using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Yukicoder { class Program { private class Edge { private readonly int _from; private readonly int _to; public Edge(int from, int to) { _from = @from; _to = to; } public int From { get { return _from; } } public int To { get { return _to; } } } static void Main(string[] args) { var line = Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); var n = line[0]; var m = line[1]; var k = line[2]; Dictionary> map = new Dictionary>(); for (int i = 0; i < m; i++) { var edge = Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); if (!map.ContainsKey(edge[2])) { map.Add(edge[2], new List()); } map[edge[2]].Add(new Edge((int)edge[0], (int)edge[1])); } var history = Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); var list = new List>>(); for (int i = 0; i < history.Length; i++) { var cost = history[i]; var candidates = new Dictionary>(); for (int j = 0; j < map[cost].Count; j++) { if (!candidates.ContainsKey(map[cost][j].From)) { candidates.Add(map[cost][j].From, new List()); } candidates[map[cost][j].From].Add(map[cost][j].To); if (!candidates.ContainsKey(map[cost][j].To)) { candidates.Add(map[cost][j].To, new List()); } candidates[map[cost][j].To].Add(map[cost][j].From); } list.Add(candidates); } int[] previous = list[0].SelectMany(element=>element.Value).Distinct().ToArray(); for (int i = 1; i < list.Count; i++) { List nexts = new List(); for (int j = 0; j < previous.Length; j++) { if (list[i].ContainsKey(previous[j])) { nexts.AddRange(list[i][previous[j]]); } } previous = nexts.Distinct().ToArray(); } Array.Sort(previous); Console.WriteLine(previous.Length); Console.WriteLine(string.Join(" ",previous)); } } }