int main() { for(cin >> T; T--;) { cin >> N >> ws; A.clear(); B.clear(); nA = nB = ""; for(int i = 0; i < N; ++i) { char c; cin >> c; nA += c; A[c] = i; } for(int i = 0; i < N; ++i) { char c; cin >> c; nB += c; B[c] = i; } vector<vector<int> > X(N), Y(N); for(int i = 0; i < N; ++i) { string s; cin >> s; for(int k = 2, j = A[s[0]]; k < s.size(); ++k) X[j].push_back(B[s[k]]); } for(int i = 0; i < N; ++i) { string s; cin >> s; for(int k = 2, j = B[s[0]]; k < s.size(); ++k) Y[j].push_back(A[s[k]]); } StableMarriage obj; vector<pair<int, int> > ans = obj.getMatch(X, Y); vector<string> ss(0); for(int i = 0; i < ans.size(); ++i) { string tmp(""); tmp += nA[ans[i].first]; tmp += ' '; tmp += nB[ans[i].second]; ss.push_back(tmp); } sort(ss.begin(), ss.end()); for(int i = 0; i < ss.size(); ++i) cout << ss[i] << endl; if(T) cout << endl; } }
int main() { int cs; scanf("%d", &cs); while(cs--) { int n; IDGen<char> mid, wid; char let[64]; scanf("%d", &n); for(int i = 0; i < n; ++i) { scanf("%s", let); mid.getId(let[0]); } for(int i = 0; i < n; ++i) { scanf("%s", let); wid.getId(let[0]); } StableMarriage sm; sm.init(n); for(int i = 0; i < n; ++i) { scanf("%s", let); int m = mid.getId(let[0]); for(int j = 2; let[j]; ++j) { int w = wid.getId(let[j]); sm.add('m', m, j - 2, w); } } for(int i = 0; i < n; ++i) { scanf("%s", let); int w = wid.getId(let[0]); for(int j = 2; let[j]; ++j) { int m = mid.getId(let[j]); sm.add('w', w, j - 2, m); } } sm.stableMatch(); vector<pair<char, char> > vp; for(int i = 0; i < n; ++i) { char m, w; m = mid.getElem(i); w = wid.getElem(sm.getMatch(i)); vp.push_back(make_pair(m, w)); } sort(vp.begin(), vp.end()); for(int i = 0; i < vp.size(); ++i) { printf("%c %c\n", vp[i].first, vp[i].second); } if(cs != 0) putchar('\n'); } }