require 'set'

def main
    al = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
    n = gets.to_i
    as = [[0]]
    while as[0].size < n
        target = as.pop
        (0..target.max+1).each do |n|
            new_a = target + [n]
            as.push new_a
        end
    end
    as.each do |a|
        s_a = []
        a.each do |m|
            s_a.push al[m]
        end
        puts s_a.join("")
    end
end

main

## イディオムなど
# until s.empty? do
#
## 配列のインデックス
# s[0,6] # 0番目から6文字
# s[0..6] # 0番目から6番目まで
# s[5..-1] # 5番目から最後まで
#
## 全探索
# [0, 1].repeated_permutation(n) do |combination| # bit全探索
# array.combination(i) do |selected| # array から要素が i 個である部分列を全部抽出
#
## 無向グラフの幅優先探索(BFS)
# to = Array.new(n).map{Array.new()} # ある頂点と繋がる頂点のリスト
# m.times do
#     a,b = gets.chomp.split(" ").map(&:to_i)
#     to[a].push b
#     to[b].push a
# end
# q = Queue.new # BFS は queue
# ds = Array.new(n, -1)
# pre = Array.new(n, -1)
#
## その他
# a1 = Marshal.load(Marshal.dump(a2)) # 深いコピー
# matrix = Array.new(n).map{Array.new()} # 二次元配列の初期化
# 