import java.io.OutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Arrays; import java.util.PriorityQueue; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; import java.util.StringTokenizer; import java.io.Writer; import java.io.OutputStreamWriter; import java.io.BufferedReader; import java.util.Comparator; import java.io.InputStream; /** * Built using CHelper plug-in * Actual solution is at the top * * @author lewin */ public class travel_log_lewin { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader2 in = new InputReader2(inputStream); OutputWriter out = new OutputWriter(outputStream); TravelLog solver = new TravelLog(); solver.solve(1, in, out); out.close(); } static class TravelLog { List[] graph; public void solve(int testNumber, InputReader2 in, OutputWriter out) { int n = in.nextInt(), m = in.nextInt(), d = in.nextInt(); graph = LUtils.genArrayList(n); for (int i = 0; i < m; i++) { int a = in.nextInt() - 1, b = in.nextInt() - 1; long c = in.nextLong(); graph[a].add(new TravelLog.Edge(b, c)); } long[] ds = in.readLongArray(d); AUtils.sort(ds); PriorityQueue pq = new PriorityQueue<>(Comparator.comparingLong(x -> x.weight)); long[] dist = new long[n]; Arrays.fill(dist, 1L << 60); pq.add(new TravelLog.Edge(0, dist[0] = 0)); int[] order = new int[n]; int oid = 0; while (pq.size() > 0) { TravelLog.Edge e = pq.poll(); if (e.weight != dist[e.to]) continue; order[oid++] = e.to; for (TravelLog.Edge nxt : graph[e.to]) { if (nxt.weight + e.weight < dist[nxt.to]) { pq.add(new TravelLog.Edge(nxt.to, dist[nxt.to] = nxt.weight + e.weight)); } } } if (ds[d - 1] > dist[n - 1]) { out.println(0); return; } int[] nways = new int[n]; int[] prev = new int[n]; Arrays.fill(prev, -1); nways[0] = 1; int ptr = 0; for (int node : order) { if (nways[node] == 0) continue; if (ptr < d && dist[node] >= ds[ptr]) ptr++; nways[node] = Math.min(nways[node], 2); for (TravelLog.Edge nxt : graph[node]) { if (nxt.weight + dist[node] == dist[nxt.to]) { if (ptr >= d || dist[nxt.to] <= ds[ptr]) { nways[nxt.to] += nways[node]; prev[nxt.to] = node; } } } } if (nways[n - 1] == 0) { out.println(0); return; } if (nways[n - 1] > 1) { out.println(1); return; } List ret = new ArrayList<>(); int cur = n - 1; while (cur != -1) { ret.add(cur); cur = prev[cur]; } out.println(ret.size()); for (int i = ret.size() - 1; i >= 0; i--) { out.println(ret.get(i) + 1); } out.println(); } static class Edge { public long weight; public int to; public Edge(int to, long weight) { this.weight = weight; this.to = to; } } } static class OutputWriter { private final PrintWriter writer; public OutputWriter(OutputStream outputStream) { writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream))); } public OutputWriter(Writer writer) { this.writer = new PrintWriter(writer); } public void print(Object... objects) { for (int i = 0; i < objects.length; i++) { if (i != 0) { writer.print(' '); } writer.print(objects[i]); } } public void println() { writer.println(); } public void println(Object... objects) { print(objects); writer.println(); } public void close() { writer.close(); } public void print(int i) { writer.print(i); } public void println(int i) { writer.println(i); } } static class InputReader2 { private BufferedReader in; private StringTokenizer st; public InputReader2(InputStream stream) { in = new BufferedReader(new InputStreamReader(stream)); st = null; } public long[] readLongArray(int tokens) { long[] ret = new long[tokens]; for (int i = 0; i < tokens; i++) { ret[i] = nextLong(); } return ret; } public int nextInt() { return Integer.parseInt(next()); } public long nextLong() { return Long.parseLong(next()); } public String next() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(in.readLine()); } catch (IOException e) { e.printStackTrace(); } } return st.nextToken(); } } static class LUtils { public static List[] genArrayList(int size) { return Stream.generate(ArrayList::new).limit(size).toArray(List[]::new); } } static class AUtils { public static void sort(long[] arr) { for (int i = 1; i < arr.length; i++) { int j = (int) (Math.random() * (i + 1)); if (i != j) { long t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } Arrays.sort(arr); } } }