시간 제한 : 2초, 난이도 : 골드 4, 백준 : 1976번

 import java.util.Scanner;
public class Practice51 {

	public static int[]parent;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		int M = sc.nextInt();
		int[][] city = new int[N + 1][N + 1];
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= N; j++) {
				city[i][j] = sc.nextInt();
			}
		}
		int[] route = new int[M + 1];
		for(int i = 1; i <= M; i++) {
			route[i] = sc.nextInt();
		}
		parent = new int[N + 1];
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= N; j++) {
				if(city[i][j] == 1) union(i, j);
			}
		}
		
		int index = find(route[1]);
		for(int i = 2; i < route.length; i++) {
			if(index != find(route[i])) {
				System.out.println("NO");
				return;
			}
		}
		System.out.println("YES");
		
		sc.close();
	}
	public static void union(int a, int b) {
		a = find(a);
		b = find(b);
		if(a != b) {
			parent[b] = a;
		}
	}
	public static int find(int a) {
		if(a == parent[a])
			return a;
		else
			return parent[a] = find(parent[a]);
	}
}