n = int(eval(input()))

strings = [[] for _ in range(n)]

for i in range(n):

    if not i:

        strings[i].append("a")

        continue

    for s in strings[i-1]:

        for j in range(ord("a"),ord(max(s))+2):

            c = chr(j)

            strings[i].append(s+c)

print((*strings[-1]))

        
import sys

sys.setrecursionlimit(10**6)#再帰を使うときはこれをする（今回はN=10で深さ110000程度なので10**6)

def dfs(s,mx):

    if len(s) == n:

        print(s)

        return

    for i in range(ord("a"),ord(mx)+1):

        c = chr(i)

        if c == mx:dfs(s+c,chr(ord(mx)+1))#aから一番遠いアルファベットを語尾につけたら、その次までok

        else:dfs(s+c,mx)

n = int(eval(input()))

dfs("","a")

n = int(eval(input()))
strings = [[] for _ in range(n)]
for i in range(n):
    if not i:
        strings[i].append("a")
        continue
    for s in strings[i - 1]:
        for j in range(ord("a"), ord(max(s)) + 2):
            c = chr(j)
            strings[i].append(s + c)
print((*strings[-1]))

import sys

sys.setrecursionlimit(10**6)  # 再帰を使うときはこれをする（今回はN=10で深さ110000程度なので10**6)


def dfs(s, mx):
    if len(s) == n:
        print(s)
        return
    for i in range(ord("a"), ord(mx) + 1):
        c = chr(i)
        if c == mx:
            dfs(s + c, chr(ord(mx) + 1))  # aから一番遠いアルファベットを語尾につけたら、その次までok
        else:
            dfs(s + c, mx)


n = int(eval(input()))
dfs("", "a")

+import sys + +sys.setrecursionlimit(10**6)  # 再帰を使うときはこれをする（今回はN=10で深さ110000程度なので10**6) + + +def dfs(s, mx): +    if len(s) == n: +        print(s) +        return +    for i in range(ord("a"), ord(mx) + 1): +        c = chr(i) +        if c == mx: +            dfs(s + c, chr(ord(mx) + 1))  # aから一番遠いアルファベットを語尾につけたら、その次までok +        else: +            dfs(s + c, mx) + + -strings = [[] for _ in range(n)] -for i in range(n): -    if not i: -        strings[i].append("a") -        continue -    for s in strings[i - 1]: -        for j in range(ord("a"), ord(max(s)) + 2): -            c = chr(j) -            strings[i].append(s + c) -print((*strings[-1])) +dfs("", "a")