
import java.util.*;
import java.io.*;

public class Gps2 {
   public static void main(String[] args) throws FileNotFoundException {
      Scanner input = new Scanner(System.in);
      String line;
      int n = input.nextInt();
      int c = 1;
      while(n>0) {
      	 int[][] A = new int[n][n];	// Adjacency matrix
      	 int[][] FW = new int[n][n];	// Shorest path distances
      	 int r = 0;			// Roads needed
      	 
      	 // Read in adjacency matrix and init FW
      	 for(int i = 0; i < n; i++) {
      	    line = input.nextLine();
      	    for(int j = 0; j < n; j++) {
      	       A[i][j] = input.nextInt();
      	       FW[i][j] = A[i][j];
      	    }
      	 }
      	 
      	 input.nextLine();
      	 // Read in path
      	 int m = input.nextInt();
      	 int[] P = new int[m];		// Desired path
      	 for(int i = 0; i < m; i++) {
      	    P[i] = input.nextInt();
      	 }
      	 
      	 // Run FW
      	 for(int i = 0; i < n; i++) {
      	    for(int j = 0; j < n; j++) {
      	       for(int k = 0; k < n; k++) {
      	       	  if(FW[j][k] == 0) {
      	       	     if(FW[j][i] > 0 && FW[i][k] > 0) {
      	       	     	FW[j][k] = FW[j][i] + FW[i][k];
      	       	     }
      	       	  }
      	       	  else if(FW[j][i] > 0 && FW[i][k] > 0) {
      	       	     FW[j][k] = Math.min(FW[j][k], FW[j][i]+FW[i][k]);
      	       	  }
      	       }
      	    }
      	 }
      	 
      	 int current = 0;
      	 while(current < m-1) {
      	    int maxPrefixEnd = current;
      	    int pathDist = 0;
      	    // While we haven't yet reached the destination
      	    // find longest usable prefix of path from current 
      	    // towards destination, i.e. max i, such that 
      	    // current  <= i <= destination, and
      	    // [path distance from current to i] == 
      	    // [actual distance from current to i]
      	    for(int i = current; i < m-1; i++) {
      	       pathDist = pathDist+A[P[i]][P[i+1]];
      	       if (pathDist == FW[P[current]][P[i+1]]) {
      	       	  maxPrefixEnd = i+1;
      	       }
      	    }
      	    //System.out.println("maxPrefixEnd is "+maxPrefixEnd);

      	    if(maxPrefixEnd < m-1) { // Then we're not there yet.
      	       r++;
      	       //System.out.println(P[maxPrefixEnd] + "," + P[maxPrefixEnd+1]);
      	    }
      	    current = maxPrefixEnd+1; // We can start at the end of the 
      	    			      // edge we just took.
      	    //System.out.println("Now at node " +current+" in the path.");
      	    
      	 }
      	 System.out.println("Case "+c+": "+r);
      	 //System.out.println();
      	 c++;
      	 line = input.nextLine();
      	 n = input.nextInt();
      }
      
   }
}
