package main
import (
"bufio"
"fmt"
"sort"
"strings"
"os"
)
func main() {
var n int
fmt.Scanf("%d", &n)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
line := scanner.Text()
a := strings.Split(line, " ")
scanner.Scan()
line = scanner.Text()
b_ := strings.Split(line, " ")
b_ = b_[1:] // 跳过m
// 去重
var mp = make(map[string]bool)
for i:=0;i<len(b_);i++{
mp[b_[i]] = true
}
var b = make([]string, len(mp))
var i int =0
for v, _ := range mp {
b[i] = v
i++
}
// 排序
sort.Slice(b, func(i, j int) bool{
if len(b[i]) == len(b[j]){
return b[i] < b[j]
}
return len(b[i]) < len(b[j])
})
type Node struct{
index int
v string
}
var result = make([][]Node, len(b))
for i=0;i<len(a);i++{
for j:=0;j<len(b);j++{
if strings.Contains(a[i], b[j]) {
result[j] = append(result[j], Node{i, a[i]})
}
}
}
var num int
for i:=0;i<len(result);i++{
if len(result[i]) > 0{
num+= 2+2*len(result[i])
}
}
fmt.Print(num," ")
for i:=0;i<len(result);i++{
if len(result[i]) > 0{
fmt.Print(b[i]," ",len(result[i])," ")
for j:=0;j<len(result[i]);j++{
fmt.Print(result[i][j].index," ", result[i][j].v," ")
}
}
}
}