import java.util.Scanner;
public class Main {
/*
*思路:每次按字典序往前缀中加字母,如果合法,就将字母加入,并打印 和 记录当前的已找到的困难串顺序
*(1)dfs(prefix) 初始时前缀prefix=""
* 依次按序遍历前l个大写字母
* 判断将当前字母加入前缀后是否合法(即是否为困难串)
* 如果合法,则将该字母加入前缀,并打印 和 cnt++(记录已找到困难串的个数)
* 继续dfs(新的prefix);在新的困难串上继续搜索
*(2)合法性:isHard(prefix,c) 判断将字符c加入prefix后,该串是否为困难串
* 从相邻重复串的长度len为1开始进行判断
* 例如:prefix=ABC c=A
* 重复长度为1: C(j=2) 与 A
* 重复长度为2:AB(j=0) 与 CA
* 若用j记录C和AB的开始坐标。初始j=prefix.length-1,更新j=j-2
*
*
*/
static int n;//找出第n小的困难串
static int l;//困难串由前l个大写字母组成
static int cnt=0;//记录已找到的困难串数目
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
l = sc.nextInt();
n = sc.nextInt();
dfs("");
}
private static void dfs(String prefix) {
//(1)依次遍历每个字符,判断加入前缀prefix后,是否为困难串
for(char i='A';i<'A'+l;i++) {
if(isHard(prefix,i)) {//(1.1) 满足要求,prefix+i为空难串
String x = prefix+i;//(1.2)获取新的前缀,并打印输出
cnt++;
System.out.println(x);
if(cnt==n) {//找到第n个困难串
System.exit(0);
}
dfs(x);//(1.3)x作为新的前缀,继续查找
}
}
}
private static boolean isHard(String prefix, char i) {
//(1)依次比较相邻子串长度为1,...,(prefix.len+1)/2时,是否重复
int len=1;
for(int j=prefix.length()-1;j>=0;j-=2) {//例如prefix=ABC i=A
String s1 = prefix.substring(j,j+len);
String s2 = prefix.substring(j+len)+i;
len++;
if(s1.equals(s2)) return false;//出现相邻重复子串
}
return true;
}
}