#include <bits/stdc++.h>
using namespace std;
struct line
{
int a;
int b;
} ln[21451];
int n,m,t,insd[214],outsd[214],it,ot,flag;
int intag[21451][2],outag[21451][2];
int cir[214],is,os,a,b,k;
void solve()
{
it=1;
ot=1;
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>ln[i].a>>ln[i].b;
for(int i=1;i<=n;i++)
{
cin>>k;
cir[k]=i;
insd[i]=1;
outsd[i]=1;
}
for(int i=1;i<=m;i++)
{
a=cir[ln[i].a];
b=cir[ln[i].b];
if(a-b==1 or b-a==1 or (a==n and b==1) or (a==1 and b==n))//是环上的边
continue;
if(a>b)
swap(a,b);
if(insd[a]==insd[b] or intag[insd[a]][0]==b or intag[insd[a]][1]==b or intag[insd[b]][0]==a or intag[insd[b]][1]==a)//在同一集合
{
flag=insd[a];
it++;
intag[it][0]=a;
intag[it][1]=b;
for(int j=a+1;j!=b;j++)
{
if(insd[j]==flag)
{
insd[j]=it;
if(j==intag[flag][0])
intag[flag][0]=-1;
else if(j==intag[flag][1])
intag[flag][1]=-1;
}
if(j>=n)
j=0;
}
continue;
}
if(outsd[a]==outsd[b] or outag[outsd[a]][0]==b or outag[outsd[a]][1]==b or outag[outsd[b]][0]==a or outag[outsd[b]][1]==a)
{
flag=outsd[a];
ot++;
outag[ot][0]=a;
outag[ot][1]=b;
for(int j=a+1;j!=b;j++)
{
if(outsd[j]==flag)
{
outsd[j]=ot;
if(j==outag[flag][0])
outag[flag][0]=-1;
else if(j==outag[flag][1])
outag[flag][1]=-1;
}
if(j>=n)
j=0;
}
continue;
}
/*for(int i=1;i<=n;i++)
cout<<insd[i];
cout<<"\n";
for(int i=1;i<=n;i++)
cout<<outsd[i];*/
cout<<"NO\n";
return;
}
/*for(int i=1;i<=n;i++)
cout<<insd[i];
cout<<"\n";
for(int i=1;i<=n;i++)
cout<<outsd[i];*/
cout<<"YES\n";
return;
}
int main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
都是NO的点输出YES,感觉是少判了什么东西