#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define REP(i,x) for(int i=0 ; i<(int)(x) ; i++) #define ALL(x) (x).begin(),(x).end() #define LL long long using namespace std; class AOJ1170{ int D,N; string src; vector piece; vector > go; vector > ac; vector fail; string alp; vector res; int L; public: AOJ1170(){ alp="."; for(char x='A' ; x<='Z' ; x++){ alp.push_back(x); } } bool init(){ scanf("%d%d",&D,&N); if(!(D||N))return false; char buf[128]; scanf("%s",buf); src = string(buf); piece.resize(N); REP(i,N){ scanf("%s",buf); piece[i] = string(buf); } sort(ALL(piece)); piece.erase(unique(ALL(piece)),piece.end()); L = piece[0].size()-1; res.clear(); return true; } int get(int s,char x){ return go[s][x]>=0?go[s][x]:(s==0?0:-1); } void makeAC(){ int size = 0; map > a; map > b; REP(i,piece.size()){ int s = 0; REP(j,piece[i].size()){ char x = piece[i][j]; if(a.count(s)==0)a[s]=map(); if(a[s].count(x)==0)a[s][x]=++size; s = a[s][x]; } if(b.count(s)==0)b[s] = vector(); b[s].push_back(i); } go.assign(size+1,vector(256,-1)); for(map >::iterator it=a.begin() ; it!=a.end() ; it++){ for(map::iterator jt=it->second.begin() ; jt!=it->second.end() ; jt++){ go[it->first][jt->first] = jt->second; } } ac.assign(size+1,vector()); for(map >::iterator it=b.begin() ; it!=b.end() ; it++){ ac[it->first] = it->second; } fail.assign(size+1,0); queue q;q.push(0); while(!q.empty()){ int s = q.front();q.pop(); REP(x,256)if(go[s][x]>=0){ int next = go[s][x]; q.push(next); if(s!=0){ int f = fail[s]; while(get(f,x)<0)f = fail[f]; fail[next] = get(f,x); ac[next].insert(ac[next].end(),ALL(ac[fail[next]])); } } } } int getNext(int st,char x){ int res = st; while(get(res,x)<0)res = fail[res]; return get(res,x); } void dfs(int num,int d,int st,int cnt,string now){ if(src.size()==num){ if(ac[st].size())res.push_back(now); if(d>0){ // insert REP(i,alp.size()){ int next = getNext(st,alp[i]); int ncnt = ac[next].size()?L:cnt-1; if(next>0&&ncnt>=0){ dfs(num,d-1,next,ncnt,now+alp[i]); } } } } else{ //src int next = getNext(st,src[num]); int ncnt = ac[next].size()?L:cnt-1; if(next>0&&ncnt>=0)dfs(num+1,d,next,ncnt,now+src[num]); if(d>0){ // insert // change REP(i,alp.size()){ next = getNext(st,alp[i]); ncnt = ac[next].size()?L:cnt-1; if(next>0&&ncnt>=0){ dfs(num,d-1,next,ncnt,now+alp[i]); dfs(num+1,d-1,next,ncnt,now+alp[i]); } } // delete dfs(num+1,d-1,st,cnt,now); } } } void solve(){ dfs(0,D,0,L,""); sort(ALL(res)); res.erase(unique(ALL(res)),res.end()); printf("%d\n",res.size()); if(res.size()<=5){ REP(i,res.size())printf("%s\n",res[i].c_str()); } } }; int main(){ AOJ1170 solver; while(solver.init()){ solver.makeAC(); solver.solve(); } return 0; }