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," ")
            }
        }
    }
    
}