#include <stdio.h>
#include <stdlib.h>

// 比较函数,用于 qsort
int compare(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}

// 判断数字 i 是否连续包含数字 j
int contains(int i, int j) { // 比如I是123,R是0
    if (i < j) return 0; // 如果123 < 0, 证明没有包含关系
    int tempI = i;
    int tempJ = j;
    if (tempJ == 0) {
        while (tempI / 10 != 0) {
            if (tempI % 10 == 0) return 1;
            else tempI /= 10;
        }
        return 0;
    } else {
        while (tempJ > 0 && tempI > 0) {
            if (tempI % 10 == tempJ % 10) {
                // printf("%d contains %d's last digit\n", tempI, tempJ);
                while(tempI % 10 == tempJ % 10){
                    tempI /= 10;
                    tempJ /= 10;
                    if(tempJ == 0) {
                        return 1;
                    }
                    if(tempI % 10 != tempJ % 10){
                        tempJ = j;
                        break;
                    }
                }
                
            } else {
                tempI /= 10;
            }
        }
    }
    return tempJ == 0;
}

int main() {
    int I[101];
    int R[101];
    int numOfI, numOfR;
    scanf("%d", &numOfI);
    for (int i = 0; i < numOfI; i++) {
        scanf("%d", &I[i]);
    }
    //test
    // for (int i = 0; i < numOfI; i++) {
    //     printf("%d\n", I[i]);
    // }
    scanf("%d", &numOfR);
    for (int i = 0; i < numOfR; i++) {
        scanf("%d", &R[i]);
    }
    //test
    // for (int i = 0; i < numOfR; i++) {
    //     printf("%d\n", R[i]);
    // }
    // 使用 qsort 对 R 进行排序
    qsort(R, numOfR, sizeof(int), compare);
    //test
    // for (int i = 0; i < numOfR; i++) {
    //     printf("%d\n", R[i]);
    // }
    // 去重并更新 numOfR
    int newR[numOfR + 1];
    int newNumOfR = 0;
    for (int i = 0; i < numOfR; i++) {
        if (R[i] == R[i + 1]) {
            // 如果后面的数字和这个数字相同,我们需要跳过相同的数字
            newR[newNumOfR++] = R[i];
            while (R[i] == R[i + 1]) { //直到遇到下一个新的数字我们停止
                i++;
            }
        } else {
            newR[newNumOfR++] = R[i];
        }
    }
    numOfR = newNumOfR;
    //test
    // for (int i = 0; i < numOfR; i++) {
    //     printf("%d\n", newR[i]);
    // }


    // 一个是满足条件的I的个数,一个是满足条件的I的索引
    int qualifyI[numOfR];
    int indexOfI[numOfR][100];
    for (int i = 0; i < numOfR; i++) {
        qualifyI[i] = 0;
    }

    int total = 0;
    for (int i = 0; i < numOfR; i++) {
        for (int j = 0; j < numOfI; j++) {
            if (contains(I[j], newR[i])) {
                // printf("find %d contains %d\n", I[j], newR[i]);
                // int foundDuplicate = 0;
                // for (int k = 0; k < qualifyI[i]; k++) {
                //     if (I[indexOfI[i][k]] == I[j]) {
                //         foundDuplicate = 1;
                //         break;
                //     }
                // }
                // if (!foundDuplicate) {
                    indexOfI[i][qualifyI[i]++] = j;
                // }
            }
        }
        if (qualifyI[i] != 0) {
            total += 2 * qualifyI[i] + 2;
        }
    }

    printf("%d ", total);
    for (int i = 0; i < numOfR; i++) {
        if (qualifyI[i] > 0) {
            printf("%d ", newR[i]);
            printf("%d ", qualifyI[i]);
            for (int j = 0; j < qualifyI[i]; j++) {
                printf("%d ", indexOfI[i][j]);
                printf("%d ", I[indexOfI[i][j]]);
            }
        }
    }
    printf("\n");

    return 0;
}