import java.util.*;
public class Main {
static class BST {
private class Node {
int data;
Node left;
Node right;
public Node(int data) {
this.data = data;
this.left = this.right = null;
}
public Node() {
}
}
private Node root;
public BST(int[] arr) {
construct(arr);
}
private void construct(int arr[]) {
Node nn = new Node();
nn.data=arr[0];
root=nn;
for(int i=1;i<arr.length;i++) {
add(root,arr[i]);
}
}
public void display() {
this.display(this.root);
}
private void display(Node node) {
// base case
if (node == null) {
return;
}
// self work
String str = "";
if (node.left == null) {
str += ".";
} else {
str += node.left.data;
}
str += " -> " + node.data + " <- ";
if (node.right == null) {
str += ".";
} else {
str += node.right.data;
}
System.out.println(str);
// left
display(node.left);
// right
display(node.right);
}
public boolean find(int item) {
return this.find(this.root, item);
}
private boolean find(Node node, int item) {
// base case
if (node == null) {
return false;
}
if (item > node.data) {// search in right tree
return find(node.right, item);
} else if (item < node.data) {// search in left tree
return find(node.left, item);
} else {// if item = data
return true;
}
}
public void add(int item) {
this.add(this.root, item);
}
private void add(Node node, int item) {
if (item > node.data) {// if item is greater add to right
if (node.right == null) {// if node doesnt has right then add here
Node nn = new Node();
nn.data = item;
node.right = nn;
} else {// if node has right child then it will handle where to place it
add(node.right, item);
}
} else {// if(item<=node.data
if (node.left == null) {
Node nn = new Node();
nn.data = item;
node.left = nn;
} else {
add(node.left, item);
}
}
}
public int max() {
return this.max(this.root);
}
private int max(Node node) {
if (node.right == null) {// if node doesn't have right child therefore it is maximum return its
return node.data;
} else {// else go to right
return max(node.right);
}
}
public void remove(int item) {
this.remove(this.root, null, false, item);// node,parent node,lchild or rchild,item, for root node parent is
// null and it doesnt make sense to call it left or right child
// of
// null therefore we can pass anyting
}
private void remove(Node node, Node parent, boolean ilc, int item) {
if (node == null) {// node is not present
return;
}
if (item > node.data) {// right call
remove(node.right, node, false, item);
} else if (item < node.data) {// left call
remove(node.left, node, true, item);
} else {
if (node.left == null && node.right == null) {// case 1
if (ilc) {// 1b
parent.left = null;
} else {// 1a
if(node==root) {
root=null;
return;
}
parent.right = null;
}
} else if (node.left == null && node.right != null) {// case 2
if (ilc) {// 2b
parent.left = node.right;
} else {// 2a
if(node==root) {
root=node.right;
return;
}
parent.right = node.right;
}
} else if (node.left != null && node.right == null) {// case 3
if (ilc) {// 3b
parent.left = node.left;
} else {// 3a
parent.right = node.left;
if(node==root) {
root=node.left;
return;
}
}
} else {// case 4
int min = min(node.right);
node.data = min;// replace with min
remove(node.right, node, false, min);// delete min
}
}
}
public void preOrder() {
this.preOrder(this.root);
}
private void preOrder(Node node) {
if (node == null) {
return;
}
System.out.print(node.data + " ");
preOrder(node.left);
preOrder(node.right);
}
private int min(Node node) {
if(node.left==null) {
return node.data;
}else {
return min(node.left);
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- != 0) {
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
BST tree = new BST(a);
int m = sc.nextInt();
int[] d = new int[m];
for (int i = 0; i < m; i++) {
d[i] = sc.nextInt();
tree.remove(d[i]);
}
// tree.display();
tree.preOrder();
System.out.println();
}
}
}