#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
// 获取I(i)中所有可能的数字
vector<int> getNum(int a) {
string str = to_string(a);
unordered_set<int> s1;
int len = str.size();
for(int i=0; i<len; ++i) {
string cur;
for(int j=i; j<len; ++j) {
cur += str[j];
if(!cur.empty()) s1.insert(stoi(cur));
}
}
return vector<int>(s1.begin(), s1.end());
}
int main() {
int ni, nr;
cin >> ni;
vector<int> I(ni,0);
for(int i=0; i<ni; ++i) {
cin >> I[i];
}
cin >> nr;
vector<int> R(nr,0);
for(int i=0; i<nr; ++i) {
cin >> R[i];
}
sort(R.begin(), R.end());
map<int, vector<int>> m1;
for(int i=ni-1; i>=0; --i) {
m1[i] = getNum(I[i]);
}
int count = 0;
vector<vector<pair<int,int>>> final_ans;
vector<int> new_R;
for(int i=0; i<nr; ++i) {
vector<pair<int,int>> ans;
if(i>0 && R[i] == R[i-1]) continue;
for(auto it=m1.begin(); it!=m1.end(); ++it) {
vector<int> nums = it->second;
for(int j=0; j<nums.size(); ++j) {
if(nums[j] == R[i]) {
ans.push_back({I[it->first], it->first});
++ count;
break;
}
}
}
if(!ans.empty()) {
final_ans.push_back(ans);
new_R.push_back(R[i]);
}
}
// 输出
count = count*2 + new_R.size()*2;
cout << count;
if(count != 0) cout << " ";
for(int i=0; i<new_R.size(); ++i) {
cout << new_R[i] << " ";
cout << final_ans[i].size() << " ";
int fsize = final_ans[i].size();
for(int j=0; j<fsize; ++j) {
cout << final_ans[i][j].second << " " << final_ans[i][j].first;
if(i == new_R.size()-1 && j == fsize-1) continue;
else cout << " ";
}
}
return 0;
}