n=int(eval(input()))

dic={0:'a',1:'b',2:'c',3:'d',4:'e',5:'f',6:'g',7:'h',8:'i',9:'j'} 

#標準形の文字列は同型の文字列の中で辞書順最小であることから、新たに付け加えるべき文字は順にa,b,c...となる

ans=[['a',1]]

for i in range(1,n):

 tmp=[]

 for prev,val in ans:

   for j in range(val+1): 

    #(今見ている文字列に使われている文字の種類数+1)種類の文字を付け加える

     if j!=val: 

        #今見ている文字列に使われている文字を付け加えるとき、文字の種類数は増加しない

       tmp.append([prev+dic[j],val])

     else: 

      #今見ている文字列に使われていない文字を付け加えるとき、文字の種類数が増加する

       tmp.append([prev+dic[j],val+1])

 ans=tmp

ans=sorted(ans,key=lambda x:x[0]) 

#生成した標準形の文字列を辞書順昇順に並べ替える

for i in range(len(ans)):

 print((ans[i][0]))
import sys

sys.setrecursionlimit(100000)



def dfs(s, mx):

    if len(s) == N:

        print(s)

        return 0

    for c in range(ord("a"), mx + 2):

        t = s

        t += chr(c)

        dfs(t, max(mx, c))



N = int(eval(input()))

dfs("", ord("a") - 1)
n = int(eval(input()))
dic = {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f", 6: "g", 7: "h", 8: "i", 9: "j"}
# 標準形の文字列は同型の文字列の中で辞書順最小であることから、新たに付け加えるべき文字は順にa,b,c...となる
ans = [["a", 1]]
for i in range(1, n):
    tmp = []
    for prev, val in ans:
        for j in range(val + 1):
            # (今見ている文字列に使われている文字の種類数+1)種類の文字を付け加える
            if j != val:
                # 今見ている文字列に使われている文字を付け加えるとき、文字の種類数は増加しない
                tmp.append([prev + dic[j], val])
            else:
                # 今見ている文字列に使われていない文字を付け加えるとき、文字の種類数が増加する
                tmp.append([prev + dic[j], val + 1])
    ans = tmp
ans = sorted(ans, key=lambda x: x[0])
# 生成した標準形の文字列を辞書順昇順に並べ替える
for i in range(len(ans)):
    print((ans[i][0]))

import sys

sys.setrecursionlimit(100000)


def dfs(s, mx):
    if len(s) == N:
        print(s)
        return 0
    for c in range(ord("a"), mx + 2):
        t = s
        t += chr(c)
        dfs(t, max(mx, c))


N = int(eval(input()))
dfs("", ord("a") - 1)

-n = int(eval(input())) -dic = {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f", 6: "g", 7: "h", 8: "i", 9: "j"} -# 標準形の文字列は同型の文字列の中で辞書順最小であることから、新たに付け加えるべき文字は順にa,b,c...となる -ans = [["a", 1]] -for i in range(1, n): -    tmp = [] -    for prev, val in ans: -        for j in range(val + 1): -            # (今見ている文字列に使われている文字の種類数+1)種類の文字を付け加える -            if j != val: -                # 今見ている文字列に使われている文字を付け加えるとき、文字の種類数は増加しない -                tmp.append([prev + dic[j], val]) -            else: -                # 今見ている文字列に使われていない文字を付け加えるとき、文字の種類数が増加する -                tmp.append([prev + dic[j], val + 1]) -    ans = tmp -ans = sorted(ans, key=lambda x: x[0]) -# 生成した標準形の文字列を辞書順昇順に並べ替える -for i in range(len(ans)): -    print((ans[i][0])) +import sys + +sys.setrecursionlimit(100000) + + +def dfs(s, mx): +    if len(s) == N: +        print(s) +        return 0 +    for c in range(ord("a"), mx + 2): +        t = s +        t += chr(c) +        dfs(t, max(mx, c)) + + +N = int(eval(input())) +dfs("", ord("a") - 1)