import std.stdio;
import std.string;
import std.conv;
import std.typecons;
import std.algorithm;
import std.functional;
import std.bigint;
import std.numeric;
import std.array;
import std.math;
import std.range;
import std.container;

long prime = 101;
char[] set = '.' ~ iota('A', 'Z'+1).map!(a=>a.to!char).array;
void main() {
    while(true) {
        int[] input = readln.split.to!(int[]);
        if (input == [0, 0]) break;
        int d = input[0];
        int n = input[1];
        char[] kaizan = readln.chomp.to!(char[]);
        char[][] pieces = new char[][n];
        foreach(int i; 0..n) {
            pieces[i] = readln.chomp.to!(char[]);
        }

        char[][] ary = [kaizan];
        ary ~= kaizan.getSet_insert;
        ary ~= kaizan.getSet_replace;
        ary ~= kaizan.getSet_remove;
        if (d==2) {
            int leng = ary.length.to!int;
            foreach (int i; 1..leng) {
                ary ~= ary[i].getSet_insert;
                ary ~= ary[i].getSet_replace;
                ary ~= ary[i].getSet_remove;
            }
        }

        char[][] ans;
        for (int i=0; i<ary.length; i++) {
            bool[] flg = new bool[ary[i].length];
            foreach(int j; 0..n) {
                rabinKarp(ary[i], pieces[j], flg);
            }
            if (flg.filter!(a=>a).array.length == flg.length) {
                ans ~= ary[i];
            }
        }
        ans = ans.sort.uniq.array;
        ans.length.writeln;
        if (ans.length <= 5) {
            for(int i=0; i<ans.length; i++) {
                ans[i].writeln;
            }
        }
    }
}
char[][] getSet_insert(char[] str) {
    char[][] result;
    for(int i=0; i<=str.length; i++) {
        for(int j=0; j<set.length; j++) {
            result ~= str[0..i] ~ set[j] ~ str[i..$];
        }
    }
    return result;
}
char[][] getSet_replace(char[] str) {
    char[][] result;
    for(int i=0; i<str.length; i++) {
        for(int j=0; j<set.length; j++) {
            if (str[i] == set[j]) continue;
            result ~= str[0..i] ~ set[j] ~ str[i+1..$];
        }
    }
    return result;
}
char[][] getSet_remove(char[] str) {
    char[][] result;
    for(int i=0; i<str.length; i++) {
        result ~= str[0..i] ~ str[i+1..$];
    }
    return result;
}
void rabinKarp(char[] target, char[] pattern, bool[] flg) {
    int leng = pattern.length.to!int;
    long ph = 0, th = 0;
    for(int i=0; i<leng; i++) {
        ph += pattern[i]*prime^^(leng-1-i);
        th += target[i]*prime^^(leng-1-i);
    }
    for(int i=0; i<target.length-leng+1; i++) {
        if (ph==th) flg[i..i+leng] = true;
        if (i<target.length-leng) th = th*prime+target[i+leng]-target[i]*prime^^leng;
    }
}