#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3, maxm = 1e6, LIM = maxm / 64;
int T, n, m, a[maxn + 5], b[maxn + 5], c[maxn + 5], d[maxn + 5], oa[maxn + 5],
    ob[maxn + 5];
struct hmbs {
  int n;
  unsigned long long z[LIM + 5];
  void reset() { memset(z, 0, (n / 64 + 1) << 3); }
  hmbs() { n = 0, reset(); }
  hmbs operator<<(int x) {
    hmbs r;
    r.n = n + x;
    r.reset();
    for (int i = (0); i <= int(n / 64); i++) {
      r.z[i + x / 64] = z[i];
    }
    x %= 64;
    if (x != 0) {
      for (int i = (r.n / 64); i >= int(0); i--) {
        r.z[i + 1] |= r.z[i] >> (64 - x);
        r.z[i] <<= x;
      }
    }
    return r;
  }
  hmbs operator&(hmbs o) {
    hmbs r;
    r.n = max(n, o.n);
    r.reset();
    for (int i = (0); i <= int(r.n / 64); i++) {
      r.z[i] = i > n / 64     ? 0 & o.z[i]
               : i > o.n / 64 ? z[i] & 0
                              : z[i] & o.z[i];
    }
    return r;
  }
  hmbs operator|(hmbs o) {
    hmbs r;
    r.n = max(n, o.n);
    r.reset();
    for (int i = (0); i <= int(r.n / 64); i++) {
      r.z[i] = i > n / 64     ? 0 | o.z[i]
               : i > o.n / 64 ? z[i] | 0
                              : z[i] | o.z[i];
    }
    return r;
  }
  hmbs operator^(hmbs o) {
    hmbs r;
    r.n = max(n, o.n);
    r.reset();
    for (int i = (0); i <= int(r.n / 64); i++) {
      r.z[i] = i > n / 64     ? 0 ^ o.z[i]
               : i > o.n / 64 ? z[i] ^ 0
                              : z[i] ^ o.z[i];
    }
    return r;
  }
} B, C, D;
bool work(int a[], int b[], int &n) {
  scanf("%d", &n);
  int sum = 0;
  for (int i = (1); i <= int(n); i++) {
    scanf("%d", &a[i]);
    sum += a[i];
  }
  if (sum & 1) {
    return false;
  }
  static int obj[maxm + 5];
  memset(obj, 0, (sum + 1) << 2);
  B.n = 0;
  B.reset();
  B.z[0] = 1;
  for (int i = (1); i <= int(n); i++) {
    C = B | (B << a[i]);
    D = C ^ B;
    for (int j = (0); j <= int(D.n / 64); j++) {
      for (unsigned long long x = D.z[j]; x; x ^= x & -x) {
        obj[64 * j + __builtin_ctzll(x & -x)] = i;
      }
    }
    B = C;
  }
  if (!obj[sum / 2]) {
    return false;
  }
  for (int i = (1); i <= int(n); i++) {
    b[i] = -1;
  }
  for (int x = sum / 2; x; x -= a[obj[x]]) {
    b[obj[x]] = 1;
  }
  return true;
}
int main() {
  scanf("%d", &T);
  while (T-- > 0) {
    bool F = true;
    F &= work(a, c, n);
    F &= work(b, d, m);
    if (!F || n != m) {
      puts("No");
      continue;
    } else {
      puts("Yes");
    }
    int ca = 0, cb = 0;
    for (int i = (1); i <= int(n); i++) {
      ca += c[i] == 1;
    }
    for (int i = (1); i <= int(m); i++) {
      cb += d[i] == 1;
    }
    if (ca <= cb) {
      for (int i = (1); i <= int(n); i++) {
        oa[i] = i;
      }
      sort(oa + 1, oa + n + 1, [&](int i, int j) {
        return c[i] > c[j] || (c[i] == c[j] && a[i] > a[j]);
      });
      for (int i = (1); i <= int(m); i++) {
        ob[i] = i;
      }
      sort(ob + 1, ob + m + 1, [&](int i, int j) {
        return d[i] > d[j] || (d[i] == d[j] && b[i] < b[j]);
      });
      int x = 0, y = 0;
      for (int i = (1); i <= int(n); i++) {
        printf("%d %d\n", x, y);
        x += c[oa[i]] * a[oa[i]];
        printf("%d %d\n", x, y);
        y += d[ob[i]] * b[ob[i]];
      }
    } else {
      for (int i = (1); i <= int(n); i++) {
        oa[i] = i;
      }
      sort(oa + 1, oa + n + 1, [&](int i, int j) {
        return c[i] > c[j] || (c[i] == c[j] && a[i] < a[j]);
      });
      for (int i = (1); i <= int(m); i++) {
        ob[i] = i;
      }
      sort(ob + 1, ob + m + 1, [&](int i, int j) {
        return d[i] > d[j] || (d[i] == d[j] && b[i] > b[j]);
      });
      int x = 0, y = 0;
      for (int i = (1); i <= int(n); i++) {
        printf("%d %d\n", x, y);
        y += d[ob[i]] * b[ob[i]];
        printf("%d %d\n", x, y);
        x += c[oa[i]] * a[oa[i]];
      }
    }
  }
  return 0;
}
