#codefestivalexhibitiona. [code_festival_exhibition_a]パズル

[code_festival_exhibition_a]パズル

问题描述

有一个由 NN 个顶点和 MM 条无向边组成的简单图(可能不连通)。这 NN 个顶点从顶点 1 开始依次编号为 1,2,...,N1,2,...,N

当选择三个不同的顶点 a,b,ca,b,c 时,如果存在连接 aabb 的边,连接 bbcc 的边,以及连接 ccaa 的边,则称 (a,b,c)(a,b,c) 是一个三元组。

现在,我们想要选择一个由三元组 (a,b,c)(a,b,c) 组成的顶点集合,并进行如下操作:

  • 将顶点 aa 的新编号设为顶点 cc 的旧编号
  • 将顶点 bb 的新编号设为顶点 aa 的旧编号
  • 将顶点 cc 的新编号设为顶点 bb 的旧编号

这个操作被称为“旋转”,我们希望对任意的三元组执行任意次数的旋转操作,最终使得每个顶点的编号分别为 y1,y2,...,yNy_1,y_2,...,y_N。请编写一个程序来判断是否可以实现这样的转换。


输入

输入数据从标准输入中读取,具体格式如下:

NN MM a1a_1 b1b_1 a2a_2 b2b_2 : aMa_M bMb_M y1y_1 y2y_2 : yNy_N

  • 第一行包含两个用空格分隔的整数 NN(表示顶点的数量,1N20001 ≤ N ≤ 2000)和 MM(表示边的数量,1M20001 ≤ M ≤ 2000)。
  • 第二行到第 MM 行,每行包含两个不同的整数 aia_ibib_i1ai,biN1≤a_i,b_i≤N),用空格分隔。这表示顶点 aia_i 和顶点 bib_i 在图中是相连的。
  • 1+M1+M 行到第 NN 行,每行包含一个不同的整数 yiy_i1yiN1≤y_i≤N),用空格分隔。这表示目标图中每个顶点的编号。

输出

如果可以实现题目描述中的转换操作,则输出 "YES",否则输出 "NO"。最后换行。


示例1


3 3
1 2
2 3
3 1
2
3
1

输出示例1


YES

由于顶点 (1,2,3)(1,2,3) 是一个三元组,我们可以执行两次旋转操作来达到目标图。


示例2


3 2
1 2
1 3
1
3
2

输出示例2


NO

由于不存在任何三元组,因此无法进行旋转操作,目标编号无法实现。


示例3


8 11
1 2
1 3
2 3
2 4
2 5
3 6
4 5
5 6
6 7
6 8
7 8
6
2
3
4
5
1
7
8

输出示例3


NO

无论如何操作,都无法使顶点 66 的编号变为 11,因此无法实现目标编号。