// @EXPECTED_RESULTS@: WRONG-ANSWER,TIMELIMIT,RUN-ERROR import java.util.ArrayList; import java.util.Scanner; import java.util.Stack; public class harry_kosaraju_indeg_counting { static int S, B, E; static ArrayList adj[]; static ArrayList adj_rev[]; static Boolean[] baddies; static Boolean[] visited; static Stack stack = new Stack(); static ArrayList> comps; static ArrayList> adj_comp; static int[] indeg; static int[] node_to_comp; static int[] bbng; public static void main(String[] args) { Scanner sc = new Scanner(System.in); S = sc.nextInt(); B = sc.nextInt(); E = sc.nextInt(); adj = (ArrayList[]) new ArrayList[S]; adj_rev = (ArrayList[]) new ArrayList[S]; baddies = new Boolean[S]; for(int i = 0; i < S; i++) { adj[i] = new ArrayList(); adj_rev[i] = new ArrayList(); baddies[i] = false; } for(int i = 0; i < E; i++) { int C1 = sc.nextInt(); int C2 = sc.nextInt(); adj[C1].add(C2); adj_rev[C2].add(C1); } for(int i = 0; i < B; i++) { int bad = sc.nextInt(); baddies[bad] = true; } stack = new Stack(); visited = new Boolean[S]; for(int i = 0; i < S; i++) visited[i] = false; for(int i = 0; i < S; i++) dfs(i); for(int i = 0; i < S; i++) visited[i] = false; comps = new ArrayList>(); adj_comp = new ArrayList>(); node_to_comp = new int[S]; int index = -1; while(!stack.isEmpty()) { int node = stack.pop(); if(!visited[node]) { index++; comps.add(new ArrayList()); comps.get(index).add(node); node_to_comp[node] = index; adj_comp.add(new ArrayList()); dfs_rev(node, index); } } int nComps = comps.size(); indeg = new int[nComps]; bbng = new int[nComps]; // This will determine whether a SCC contains a bad spy. int indegzero = 0; for(int i = 0; i < nComps; i++) { ArrayList list = adj_comp.get(i); for(int j: list) indeg[j]++; } for(int i = 0; i < nComps; i++) { bbng[i] = -1; // -1 = unvisited, 0 = good, 1 = bad ArrayList comp = comps.get(i); for(int j: comp) if(baddies[j]) bbng[i] = 1; } for(int i = 0; i < nComps; i++) if(bbng[i] == -1) find_baddies(i); for(int i = 0; i < nComps; i++) if(bbng[i] == 1) { ArrayList adjs = adj_comp.get(i); for(int j: adjs) { indeg[j]--; if(indeg[j] == 0 && bbng[j] == 0) indegzero++; } } int total = indegzero; for(int i = 0; i < nComps; i++) if(bbng[i] == 1) total += comps.get(i).size(); total -= B; System.out.println(total); } static void dfs(int node) { if(visited[node]) return; visited[node] = true; for(int i: adj[node]) if(!visited[i]) { dfs(i); visited[i] = true; } stack.push(node); } static void dfs_rev(int node, int index) { if(visited[node]) return; visited[node] = true; for(int i: adj_rev[node]) { if(!visited[i]) { node_to_comp[i] = index; comps.get(index).add(node_to_comp[i]); dfs_rev(i, index); } else { adj_comp.get(node_to_comp[i]).add(index); } } } static void find_baddies(int comp) { for(int i: adj_comp.get(comp)) { if(bbng[i] == -1) find_baddies(i); if(bbng[i] == 1) bbng[comp] = 1; } if(bbng[comp] == -1) bbng[comp] = 0; } }