#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const long long mx = 2e5 + 5;
vector<long long> prime;
long long isPrime[mx];
void seive() {
  for (long long i = 2; i < mx; ++i) {
    if (isPrime[i] == 0) {
      prime.push_back(i);
      for (long long j = i * i; j < mx; j += i) {
        isPrime[j] = 1;
      }
    }
    isPrime[i] ^= 1;
  }
}
long long ncr(long long n, long long k) {
  double res = 1;
  for (long long i = 1; i <= k; ++i) res = res * (n - k + i) / i;
  return (long long)(res + 0.01);
}
void Loser() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
long long ceil(long long A, long long B) {
  if (A % B == 0)
    return A / B;
  else
    return (A / B) + 1ll;
}
long long middle(long long a, long long b, long long c) {
  if ((a <= b && b <= c) || (c <= b && b <= a))
    return b;
  else if ((b <= a && a <= c) || (c <= a && a <= b))
    return a;
  else
    return c;
}
bool as_second(const pair<long long, long long> &a,
               const pair<long long, long long> &b) {
  return (a.second < b.second);
}
bool ds_first(const pair<long long, long long> &a,
              const pair<long long, long long> &b) {
  return (a.first > b.first);
}
bool ds_second(const pair<long long, long long> &a,
               const pair<long long, long long> &b) {
  return a.second > b.second;
}
string str, str1, str2, str3, str4, str5, str6, str7;
char ch, ch1, ch2, ch3;
bool flag, flag1, flag2;
long long a, b, c, d, e, f, g, h, l, i, j, k, m, n, o, p, q, r, s, t, u, v, w,
    x, y, z, pos, res, res1, test, cnt, cnt1, cnt2, cnt3, cnt4, sum, sum1, sum2,
    sum3, ans, ans1, ans2, ans3, ma, ma1, ma2, ma3, mi, mi1, mi2, mi3, temp,
    temp1, temp2, temp3, temp4;
void SectumSempra() {
  cin >> n >> m;
  vector<vector<long long> > mat(n, vector<long long>(m));
  map<long long, long long> mp, mp1;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      cin >> x;
      mp[x] = j;
    }
  }
  for (long long i = 0; i < m; i++) {
    for (long long j = 0; j < n; j++) {
      cin >> x;
      mp1[x] = j;
    }
  }
  for (auto i : mp) {
    x = mp1[i.first], y = i.second;
    mat[x][y] = i.first;
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) cout << mat[i][j] << " \n"[j == m - 1];
  }
}
int main() {
  Loser();
  cin >> test;
  seive();
  while (test--) {
    SectumSempra();
  }
  return 0;
}
