#include <bits/stdc++.h>
using namespace std;
std::mt19937 rnd(
    (int)std::chrono::steady_clock::now().time_since_epoch().count());
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
struct P {
  int x, y;
  P() {}
  P(int x, int y) : x(x), y(y) {}
};
int nhor;
vector<int> hor;
int nver;
vector<int> ver;
vector<P> ans;
bool split(vector<int> a, vector<int>& b, vector<int>& c) {
  int asum = 0;
  for (int i = (0); i < (((int)(a).size())); ++i) asum += a[i];
  if (asum % 2 != 0) return false;
  int want = asum / 2;
  vector<int> can(want + 1, -2);
  can[0] = -1;
  for (int i = (0); i < (((int)(a).size())); ++i)
    for (int j = want - a[i]; j >= 0; --j)
      if (can[j] != -2 && can[j + a[i]] == -2) can[j + a[i]] = i;
  if (can[want] == -2) return false;
  vector<bool> inb(((int)(a).size()), false);
  for (int x = want; x != 0; x -= a[can[x]]) inb[can[x]] = true;
  b.clear();
  c.clear();
  for (int i = (0); i < (((int)(a).size())); ++i)
    if (inb[i])
      b.push_back(a[i]);
    else
      c.push_back(a[i]);
  return true;
}
bool solve() {
  if (nhor != nver) return false;
  vector<int> lft, rgt;
  if (!split(hor, lft, rgt)) return false;
  if (((int)(rgt).size()) > ((int)(lft).size())) swap(lft, rgt);
  vector<int> up, dn;
  if (!split(ver, up, dn)) return false;
  if (((int)(dn).size()) > ((int)(up).size())) swap(up, dn);
  int acnt = ((int)(rgt).size());
  assert(((int)(up).size()) >= acnt);
  int ccnt = ((int)(dn).size());
  assert(((int)(lft).size()) >= ccnt);
  int bcnt = nhor - acnt - ccnt;
  vector<int> ahor(acnt), aver(acnt);
  for (int i = (0); i < (acnt); ++i) ahor[i] = rgt[i], aver[i] = up[i];
  vector<int> bhor(bcnt), bver(bcnt);
  for (int i = (0); i < (bcnt); ++i) bhor[i] = lft[i], bver[i] = up[acnt + i];
  vector<int> chor(ccnt), cver(ccnt);
  for (int i = (0); i < (ccnt); ++i) chor[i] = lft[bcnt + i], cver[i] = dn[i];
  sort(ahor.begin(), ahor.end());
  reverse(ahor.begin(), ahor.end());
  sort(aver.begin(), aver.end());
  sort(chor.begin(), chor.end());
  reverse(chor.begin(), chor.end());
  sort(cver.begin(), cver.end());
  ans.clear();
  ans.push_back(P(0, 0));
  auto append = [&](int dx, int dy) {
    P p(ans.back().x + dx, ans.back().y + dy);
    ans.push_back(p);
  };
  for (int i = (0); i < (acnt); ++i) append(+ahor[i], 0), append(0, +aver[i]);
  for (int i = (0); i < (bcnt); ++i) append(-bhor[i], 0), append(0, +bver[i]);
  for (int i = (0); i < (ccnt); ++i) append(-chor[i], 0), append(0, -cver[i]);
  assert(ans.back().x == 0 && ans.back().y == 0);
  ans.pop_back();
  return true;
}
void run() {
  scanf("%d", &nhor);
  hor = vector<int>(nhor);
  for (int i = (0); i < (nhor); ++i) scanf("%d", &hor[i]);
  scanf("%d", &nver);
  ver = vector<int>(nver);
  for (int i = (0); i < (nver); ++i) scanf("%d", &ver[i]);
  if (!solve()) {
    printf("No\n");
    return;
  }
  printf("Yes\n");
  for (int i = (0); i < (((int)(ans).size())); ++i)
    printf("%d %d\n", ans[i].x, ans[i].y);
}
int main() {
  int ncase;
  scanf("%d", &ncase);
  for (int i = (1); i <= (ncase); ++i) run();
  return 0;
}
