#include<bits/stdc++.h>
#define int long long
#define il inline
namespace things{
il int rd(){
int f = 1, x = 0;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
}
using namespace things;
using namespace std;
const int N = 2e5 + 5, M = 4e5 + 5, INF = 0x3f3f3f3f;
int n, m, p, b, ok[N], st[N];
struct node{
int to, next;
}e[M];
int pre[M], k, dis[N], ans[N], sum;
map<int, int> mp;
void add(int u, int v){
e[++k] = {v, pre[u]};
pre[u] = k;
}
queue<int> q;
void bfs(int s){
q.push(s);
dis[s] = 0;
while(q.size()){
int u = q.front();
q.pop();
for (int i = pre[u]; i; i = e[i].next){
int v = e[i].to;
if (dis[v] > dis[u] + 1 && (u == 1 || ok[u])){
dis[v] = dis[u] + 1;
q.push(v);
}
}
}
}
int calc(int u){
if (ok[u]){
for (int i = pre[u]; i; i = e[i].next){
int v = e[i].to;
if (ok[v]) return INF;
}
}
else{
for (int i = pre[u]; i; i = e[i].next){
int v = e[i].to;
if (ok[v]){
for (int j = pre[v]; j; j = e[j].next){
int w = e[j].to;
if (ok[w]) return INF;
}
return 1;
}
}
}
return 0;
}
il void work(){
n = rd(), m = rd(), p = rd(), b = rd();
for (int i = 1; i <= n; i++) dis[i] = INF, ok[i] = pre[i] = sum = 0;
k = 0, mp.clear();
for (int i = 1; i <= p; i++) st[i] = rd(), mp[st[i]] = 1;
for (int i = 1, x; i <= b; i++){
x = rd();
ok[x] = 1;
}
for (int i = 1, u, v; i <= m; i++){
u = rd(), v = rd();
add(u, v), add(v, u);
}
bfs(1);
for (int i = 1; i <= p; i++) ans[st[i]] = calc(st[i]), sum += ans[st[i]];
for (int i = 1; i <= p; i++){
if (dis[st[i]] < INF && dis[st[i]] - 1 <= sum - ans[st[i]]){
cout << "YES\n";
return ;
}
}
cout << "NO\n";
}
signed main(){
int t = 1;
t = rd();
while(t--) work();
return 0;
}