#include <vector>
#include <bitset>
#include <cstdio>
#include <unordered_map>
const int Maxn=5000;
const int Maxm=5000;
int n,m;
int w[Maxn+5];
bool vis[Maxn+5];
struct Graph{
int deg[Maxn+5];
int head[Maxn+5],arrive[Maxm+5],nxt[Maxm+5],tot;
void add_edge(int from,int to){
arrive[++tot]=to;
nxt[tot]=head[from];
head[from]=tot;
deg[to]++;
}
std::bitset<Maxn+5> g[Maxn+5];
void init(){
tot=0;
for(int i=1;i<=n;i++){
deg[i]=0;
g[i].reset();
head[i]=0;
}
}
void work(){
static int qu[Maxn+5],qu_f,qu_t;
for(int i=1;i<=n;i++){
for(int j=0;j<n;j++){
g[i][j]=1;
}
}
qu_f=1,qu_t=0;
for(int i=1;i<=n;i++){
if(deg[i]==0){
g[i].reset();
qu[++qu_t]=i;
}
}
while(qu_f<=qu_t){
int u=qu[qu_f++];
g[u][u-1]=1;
for(int i=head[u];i;i=nxt[i]){
int v=arrive[i];
deg[v]--;
g[v]&=g[u];
if(deg[v]==0){
qu[++qu_t]=v;
}
}
}
}
}g[2];
std::bitset<Maxn+5> val[Maxn+5];
std::unordered_map<std::bitset<Maxn+5>,std::vector<int> > ans;
void init(){
g[0].init(),g[1].init();
for(int i=1;i<=n;i++){
val[i].reset();
vis[i]=0;
}
ans.clear();
}
void solve(){
scanf("%d",&n);
init();
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
{
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++){
int a;
scanf("%d",&a);
vis[a]=1;
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
g[0].add_edge(u,v),g[1].add_edge(v,u);
}
g[0].work(),g[1].work();
for(int i=1;i<=n;i++){
val[i]=g[0].g[i]|g[1].g[i];
}
for(int i=1;i<=n;i++){
ans[val[i]].push_back(i);
}
int num=0;
for(int i=1;i<=n;i++){
if(!vis[i]){
num++;
}
}
printf("%d ",num);
for(int i=1;i<=n;i++){
if(!vis[i]){
printf("%d ",i);
}
}
puts("");
printf("%u\n",ans.size());
std::unordered_map<std::bitset<Maxn+5>,std::vector<int> >::iterator ans_it;
ans_it=ans.begin();
while(ans_it!=ans.end()){
printf("%u ",(ans_it->second).size());
std::vector<int>::iterator lis_it=(ans_it->second).begin();
while(lis_it!=(ans_it->second).end()){
printf("%d ",(*lis_it));
lis_it++;
}
puts("");
ans_it++;
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
solve();
}
return 0;
}