#include <bits/stdc++.h>   using namespace std;   void read() { return; }   void wrt() { cout << (string)   n ; }   void wrt(long long t) { cout << t; }   void wrt(int t) { cout << t; }   void wrt(char t) { cout << t; }   void wrt(string t) { cout << t; }   void wrt(double t) { cout << t; }   template <class T>   void wrt(set<T> v);   template <class T>   void wrt(vector<T> v);   template <class T>   void wrt(multiset<T> v);   template <class T, class V>   void wrt(map<T, V> v);   template <class T, class V>   void wrt(pair<T, V> p);   template <size_t T>   void wrt(const char (&a)[T]) {     string s = a;     wrt(s);     wrt();   }   template <class T>   void wrt(set<T> v) {     for (T i : v) {       wrt(i);       wrt(   );     }     wrt();   }   template <class T>   void wrt(vector<T> v) {     for (T i : v) {       wrt(i);       wrt(   );     }     wrt();   }   template <class T>   void wrt(multiset<T> v) {     for (T i : v) {       wrt(i);       wrt(   );     }     wrt();   }   template <class T, class V>   void wrt(map<T, V> v) {     for (auto i : v) {       wrt(i);       wrt(   );     }     wrt();   }   template <class T, class V>   void wrt(pair<T, V> p) {     wrt(p.first);     wrt(   );     wrt(p.second);     wrt();   }   template <class T, class... V>   void wrt(T x, V... args) {     (wrt(x), wrt(   ), wrt(args...));   }   template <class T, class... V>   void read(T &x, V &...args) {     ((cin >> x), read(args...));   }   template <class T>   void readArr(T &arr, int x, int y) {     for (int i = (int)x; i < (int)y; ++i) cin >> arr[i];   }   const int N = 1e6;   const int INF = INT_MAX;   const int MOD = 1e9 + 7;   int countBits(long long number) { return (int)log2(number) + 1; }   long long getSum(vector<int> a) { return accumulate(a.begin(), a.end(), 0ll); }   long long gcd(long long a, long long b) {     return (b == 0) ? (a) : (gcd(b, a %= b));   }   long long lcd(long long a, long long b) { return (a * b) / gcd(a, b); }   long long add(long long x, long long y) { return (x + y) % MOD; }   long long sub(long long x, long long y) { return (x - y + MOD) % MOD; }   long long mul(long long x, long long y) { return (x * 1ll * y) % MOD; }   long long inv(long long p, long long q) {     long long expo = MOD - 2;     while (expo) {       if (expo & 1) p = mul(p, q);       q = mul(q, q), expo >>= 1;     }     return p;   }   long long power(long long x, long long y) {     if (y == 0)       return 1;     else if (y % 2 == 0) {       long long tmp = power(x, y / 2);       return mul(tmp, tmp);     } else       return mul(x, power(x, y - 1));   }   void solveTestCase() {     int n, m;     read(n, m);     vector<int> f(n * m + 1, -1);     vector<vector<int> > r(n, vector<int>(m)), c(m, vector<int>(n));     for (int i = (int)0; i < (int)n; ++i) readArr(r[i], 0, m);     for (int i = (int)0; i < (int)m; ++i) readArr(c[i], 0, n);     for (int i = (int)0; i < (int)n; ++i) {       f[c[0][i]] = i;     }     vector<vector<int> > ans(n, vector<int>(m));     for (int i = (int)0; i < (int)n; ++i) {       int done = -1;       for (int j = (int)0; j < (int)m; ++j) {         if (f[r[i][j]] != -1) {           done = f[r[i][j]];           break;         }       }       for (int j = (int)0; j < (int)m; ++j) {         ans[done][j] = r[i][j];       }     }     wrt(ans);   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0), cout.tie(0);     ;     int t = 1;     cin >> t;     while (t--) solveTestCase();     return 0;   }