import std.algorithm;
import std.array;
import std.container;
import std.conv;
import std.math;
import std.numeric;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

// n 文字目までに k 種類の文字を使っているなら
// n+1 文字目は k+1 種類の文字が使える
void calc(int n) {
    void rec(int[] cs, int p, int k) {
        if (p == n) {
            string s = cs.map!(c => text(cast(char)(c + 'a'))).join("");
            writeln(s);
            return;
        }

        foreach (i; 0..k+1) {
            cs[p] = i;
            rec(cs, p+1, i == k ? k+1 : k);
        }
    }

    auto cs = new int[n];
    rec(cs, 0, 0);
}

void main() {
    int n; scan(n);
    calc(n);
}

void scan(T...)(ref T a) {
    string[] ss = readln.split;
    foreach (i, t; T) a[i] = ss[i].to!t;
}
T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;
