#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define num 10000
struct have{
int locat[num];
int all_n;
};
int get_sn(int l,int s){
int i,j,len_l=1,len_s=1,tl,ts,n=0,temp=1;
tl=l;
ts=s;
while((tl/=10)) len_l++;
while((ts/=10)) len_s++;
for(i=0;i<len_s;i++) temp*=10;
if(len_l<len_s) return 0;
for(i=0;i<len_l-len_s+1;i++){
if(((len_l-i)==len_s)&&(l==s)) return 1;
else if(((len_l-i)==len_s)&&(l!=s)) return 0;
if(l%(l/temp*temp)==s) return 1;
l/=10;
}
return 0;
}
void get_list(struct have *list,int *l,int *s,int l_n,int s_n){
int i,j;
for(i=0;i<s_n;i++){
list[i].all_n=0;
for(j=0;j<l_n;j++){
if(get_sn(l[j],s[i])){
list[i].locat[list[i].all_n]=j;
list[i].all_n++;
}
}
}
}
int main(void) {
int l[num],s[num],l_n,s_n,all_n,i,j,temp,tot_n=0;
while(scanf("%d",&l_n)!=-1){
for(i=0;i<l_n;i++) scanf("%d",l+i);
scanf("%d",&s_n);
for(i=0;i<s_n;i++) scanf("%d",s+i);
for(i=0;i<s_n-1;i++){
for(j=0;j<s_n-1-i;j++){
if(s[j]>s[j+1]){
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
j=0;
for(i=0;i<s_n;i++){
s[j]=s[i];
if(s[i]!=s[i+1]) j++;
}
s_n=j;
struct have list[s_n];
get_list(list,l,s,l_n,s_n);
tot_n=0;
for(i=0;i<s_n;i++){
if(list[i].all_n!=0) tot_n+=list[i].all_n*2+2;
}
printf("%d ",tot_n);
for(i=0;i<s_n;i++){
if(list[i].all_n!=0) {
printf("%d %d ",s[i],list[i].all_n);
for(j=0;j<list[i].all_n;j++) printf("%d %d ",list[i].locat[j],l[list[i].locat[j]]);
}
}
printf("\n");
}
return 0;
}