// ACM-ICPCà\I2010 F. Ã¢L¯

#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

const int INF = 100000000;

int d;
string mes, cur;
vector<string> piece;
vector<int> connect[30][20];
vector<string> ans;
set<string> mem[43];
int dp[43][43];
int cnt = 0;

bool editDist(int s, int e){
	for(int i=s+1;i<=e;i++){
		int m = INF;
		for(int j=max(1,i-d);j<=min((int)mes.size(),i+d);j++){
			if(cur[i-1]==mes[j-1]) dp[i][j] = dp[i-1][j-1];
			else {
				dp[i][j] = dp[i-1][j-1]+1;
				dp[i][j] = min(dp[i][j], dp[i-1][j]+1);
				dp[i][j] = min(dp[i][j], dp[i][j-1]+1);
			}
			m = min(m, dp[i][j]);
		}
		if(m > d) return false;
	}
	return true;
}

void solve(int pIdx){
	cnt++;
	int len = piece[0].size();
	int csize = cur.size();
	for(int j=len-1;j>=0;j--){
		int nsize = csize + len - j;
		if(nsize > mes.size() + d) break;
		cur += ' ';
		for(int i=0;i<connect[pIdx][j].size();i++){
			bool flag = true;
			for(int k=j;k<len;k++){
				cur[csize+k-j] = piece[connect[pIdx][j][i]][k];
				if(!editDist(csize+k-j, csize+k-j+1)){
					flag = false;
					break;
				}
			}
			if(!flag) continue;
			if(mem[nsize].count(cur)) continue;
			mem[nsize].insert(cur);
//			if(!editDist(csize, nsize)) continue;
			if(mes.size()-d <= nsize && nsize <= mes.size()+d && dp[nsize][mes.size()] <= d)
				ans.push_back(cur);
			solve(connect[pIdx][j][i]);
		}
	}
	cur = cur.substr(0, csize);
}

int main(){
	int n, len;
	for(int i=0;i<=42;i++) dp[i][0] = dp[0][i] = i;
	while(cin >> d >> n, n){
		cin >> mes;
		piece.clear();
		for(int i=0;i<n;i++){
			string str; cin >> str;
			piece.push_back(str);
		}
		sort(piece.begin(), piece.end());
		piece.erase(unique(piece.begin(), piece.end()), piece.end());
		len = piece[0].size();
		for(int i=1;i<=mes.size()+d;i++)
			for(int j=1;j<=mes.size()+d;j++)
				if(abs(i-j) > d) dp[i][j] = INF;
		for(int i=0;i<piece.size();i++){
			for(int k=0;k<len;k++){
				connect[i][k].clear();
				for(int j=0;j<piece.size();j++){
					if(piece[i].substr(len-k) == piece[j].substr(0,k))
						connect[i][k].push_back(j);
				}
			}
		}
		for(int i=0;i<=mes.size()+d;i++)
			mem[i].clear();
		ans.clear();
		cnt = 0;
		for(int i=0;i<piece.size();i++){
			cur = piece[i];
			if(!editDist(0, len)) continue;
			if(mes.size()-d <= cur.size() && cur.size() <= mes.size()+d && dp[cur.size()][mes.size()] <= d)
				ans.push_back(cur);
			solve(i);
		}
		sort(ans.begin(), ans.end());
		ans.erase(unique(ans.begin(), ans.end()), ans.end());
		cout << ans.size() << endl;
		if(ans.size() <= 5){
			for(int i=0;i<ans.size();i++)
				cout << ans[i] << endl;
		}
	}
}


/*
string mes;
vector<string> piece;
vector< pair<int,int> > connect[30];
vector<string> ans;
set<string> mem;
int dp[43][43];
int cnt = 0;

bool editDist(string cur, int s, int e, int d){
	for(int i=s+1;i<=e;i++){
		int m = INF;
		for(int j=max(1,i-d);j<=min((int)mes.size(),i+d);j++){
			if(cur[i-1]==mes[j-1]) dp[i][j] = dp[i-1][j-1];
			else {
				dp[i][j] = dp[i-1][j-1]+1;
				dp[i][j] = min(dp[i][j], dp[i-1][j]+1);
				dp[i][j] = min(dp[i][j], dp[i][j-1]+1);
			}
			m = min(m, dp[i][j]);
		}
		if(m > d) return false;
	}
	return true;
}

void solve(string cur, int d, int pIdx, int p1, int p2){
	cnt++;
	int len = piece[0].size();
	for(int i=0;i<connect[pIdx].size();i++){
		int nsize = cur.size() + len - connect[pIdx][i].second;
		if(nsize > mes.size() + d) continue;
//		string nxt = cur + piece[connect[pIdx][i].first].substr(connect[pIdx][i].second);
		if(mem.count(nxt)) continue;
		mem.insert(nxt);
		if(!editDist(nxt, cur.size(), nxt.size(), d)) continue;
		if(mes.size()-d <= nxt.size() && nxt.size() <= mes.size()+d && dp[nxt.size()][mes.size()] <= d)
			ans.push_back(nxt);
		solve(nxt, d, connect[pIdx][i].first, p2, nxt.size());
	}
}

int main(){
	int d, n, len;
	for(int i=0;i<=42;i++) dp[i][0] = dp[0][i] = i;
	while(cin >> d >> n, n){
		cin >> mes;
		piece.clear();
		for(int i=0;i<n;i++){
			string str; cin >> str;
			piece.push_back(str);
		}
		sort(piece.begin(), piece.end());
		piece.erase(unique(piece.begin(), piece.end()), piece.end());
		len = piece[0].size();
		for(int i=1;i<=mes.size()+d;i++)
			for(int j=1;j<=mes.size()+d;j++)
				if(abs(i-j) > d) dp[i][j] = INF;
		for(int i=0;i<piece.size();i++){
			connect[i].clear();
			for(int j=0;j<piece.size();j++){
				connect[i].push_back(make_pair(j,0));
				for(int k=1;k<len;k++){
					if(piece[i].substr(len-k) == piece[j].substr(0,k))
						connect[i].push_back(make_pair(j,k));
				}
			}
		}
		mem.clear();
		string cur;
		ans.clear();
		cnt = 0;
		for(int i=0;i<piece.size();i++){
			cur = piece[i];
			if(!editDist(cur, 0, len, d)) continue;
			if(mes.size()-d <= cur.size() && cur.size() <= mes.size()+d && dp[cur.size()][mes.size()] <= d)
				ans.push_back(cur);
			solve(cur, d, i, len, 0);
		}
		sort(ans.begin(), ans.end());
		ans.erase(unique(ans.begin(), ans.end()), ans.end());
		cout << ans.size() << endl;
		if(ans.size() <= 5){
			for(int i=0;i<ans.size();i++)
				cout << ans[i] << endl;
		}
	}
}
*/

Measured memory_bytes: 15000