module main; // https://kmjp.hatenablog.jp/entry/2014/12/08/0930 より // 重み付きグラフ import std; struct Edge { int to; long cost; } void main() { // 入力 int N, M, K; readln.chomp.formattedRead("%d %d %d", N, M, K); auto E = new Edge[][](N); foreach (_; 0 .. M) { int a, b; long c; readln.chomp.formattedRead("%d %d %d", a, b, c); --a, --b; E[a] ~= Edge(b, c); E[b] ~= Edge(a, c); } auto D = readln.split.to!(long[]); // 答えの計算 auto visited = new bool[][](2, N); visited[0][] = true; foreach (i; 0 .. K) { int cur = i % 2, tar = cur ^ 1; visited[tar][] = false; foreach (x; 0 .. N) { if (!visited[cur][x]) continue; foreach (y; 0 .. E[x].length) if (E[x][y].cost == D[i]) visited[tar][E[x][y].to] = true; } } int[] ans; foreach (i; 0 .. N) if (visited[K % 2][i]) ans ~= i + 1; // 答えの出力 writeln(ans.length); writefln("%(%d %)", ans); }