#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
//英语 看博友分析 抄博友程序 百练pe POJac 例题 dfs输出+dp 巧妙 背
char hs[30]="22233344115566070778889990";//抄博友程序
char c[120];
int dp[110];//到位置i最少由几个单词组成
int road[110];//标记是哪个单词
char a[50020][60];//数字组成的字符串
char b[50020][60];//字母组成的字符串
void dfs(int x)
{
//cout<<x<<endl;
if(x!=0)//抄博友程序
{
dfs(x-strlen(a[road[x]]));
cout<<b[road[x]]<<" ";
}
}
int main()
{
while(cin>>c)
{
memset(dp,0,sizeof(dp));
memset(road,0,sizeof(road));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>b[i];
for(int j=0;j<strlen(b[i]);j++)
{
a[i][j]=hs[b[i][j]-'a'];
}
}
for(int i=1;i<=strlen(c);i++)
{
dp[i]=strlen(c)+1;
}
dp[0]=0;//抄博友程序
for(int i=1;i<=strlen(c);i++)
{
for(int j=1;j<=n;j++)//抄博友程序 背
{
if(i>=strlen(a[j])&&strncmp(&c[i-strlen(a[j])],a[j],strlen(a[j]))==0)//巧妙
{
if(dp[i]>dp[i-strlen(a[j])]+1)
{
dp[i]=dp[i-strlen(a[j])]+1;
road[i]=j;
}
}
}
}
if(dp[strlen(c)]==strlen(c)+1)
{
cout<<"No solution."<<endl;
}else
{
dfs(strlen(c));
cout<<endl;
}
cout<<endl;
}
return 0;
}