#include <bits/stdc++.h>
using namespace std;
int main() {
    int i;
    int r;
    cin >> i;
    int I[i]; //用于接收I序列
    for(int j = 0; j < i; ++j) {
        cin >> I[j]; 
    }
    cin >> r;
    int R[r]; //用于接收R序列
    set<int> s; //利用set按照key值大小有序排列,免去手动去重工作
    map<int, vector<int>> m; //m中的元素和s中的元素一一对应,并且m中会记录I序列中符合条件的元素,使用vector进行记录。
    for(int j = 0; j < r; ++j) {
        cin >> R[j];
        s.insert(R[j]);
    }
    for(auto it = s.begin(); it != s.end(); ++it) {
        vector<int> vec; //
        m[*it] = vec;
        for(int j = 0; j < i; ++j) { //此处循环遍历I序列中是否存在R<i>
            if(to_string(I[j]).find(to_string(*it)) != string::npos) {
                m[*it].push_back(j);//如果满足条件,则把满足条件的下标插入m中。
            }
        }
    }
    vector<int> res; //用于记录输出
    for(auto it = s.begin(); it != s.end(); ++it) {
        if(m[*it].empty()) continue;
        else {
            res.push_back(*it);//符合元素的i
            res.push_back(m[*it].size());//符合R<i>的个数
            for(int j = 0; j < m[*it].size(); ++j) {
                res.push_back(m[*it][j]); //R<i>的下标
                res.push_back(I[m[*it][j]]); //根据R<i>下标找出该元素
            }
        }
    }
    cout << res.size() << " ";
    for(int j = 0; j < res.size(); ++j) {
        cout << res[j] << " ";
    }
}