#include <bits/stdc++.h>
using namespace std;
int n,L;
int cnt=0;
int s[90]={0};
int dfs(int cur)
{
if(cnt++==n)//每次出现一个hard,就加一。
{int grap=0;
for(int i=0; i<cur; i++)
{
if(i!=0&&i%4==0)
{
grap++;
if(grap!=16)
printf(" ");
}
if(grap==16)
{grap++;//必须控制否则在grap改变之前,一直变不了,一直出现回车
printf("\n");}
printf("%c",s[i]+'A');
}
printf("\n%d\n",cur);
return 0;
}
else
for(int i=0; i<L; i++)
{
int ok=1;
s[cur]=i;
//判断加入一个新的字母后后缀是否和前缀相等,后缀为一个字母开始,一直到一半的字母和前面是否相等
for(int j=1; j*2<=cur+1; j++)
{
int mark=1;
for(int k=0; k<j; k++)
if(s[cur-k]!=s[cur-k-j])
{
mark=0;
break;
}
if(mark)
{
ok=0;
break;//不能加这个字母
}
}
if(ok)//可以加这个字母
if(!dfs(cur+1))//找到最终的解
return 0;
}
return 1;
}
int main()
{
while(~scanf("%d%d",&n,&L)&&n&&L)
{
cnt=0;
dfs(0);
}
return 0;
}
using namespace std;
int n,L;
int cnt=0;
int s[90]={0};
int dfs(int cur)
{
if(cnt++==n)//每次出现一个hard,就加一。
{int grap=0;
for(int i=0; i<cur; i++)
{
if(i!=0&&i%4==0)
{
grap++;
if(grap!=16)
printf(" ");
}
if(grap==16)
{grap++;//必须控制否则在grap改变之前,一直变不了,一直出现回车
printf("\n");}
printf("%c",s[i]+'A');
}
printf("\n%d\n",cur);
return 0;
}
else
for(int i=0; i<L; i++)
{
int ok=1;
s[cur]=i;
//判断加入一个新的字母后后缀是否和前缀相等,后缀为一个字母开始,一直到一半的字母和前面是否相等
for(int j=1; j*2<=cur+1; j++)
{
int mark=1;
for(int k=0; k<j; k++)
if(s[cur-k]!=s[cur-k-j])
{
mark=0;
break;
}
if(mark)
{
ok=0;
break;//不能加这个字母
}
}
if(ok)//可以加这个字母
if(!dfs(cur+1))//找到最终的解
return 0;
}
return 1;
}
int main()
{
while(~scanf("%d%d",&n,&L)&&n&&L)
{
cnt=0;
dfs(0);
}
return 0;
}