#include <bits/stdc++.h>
using namespace std;
long long int mpow(long long int a, long long int b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0) {
    long long int memo = mpow(a, b / 2);
    return memo * memo % (long long int)(1e9 + 7);
  } else
    return mpow(a, b - 1) * a % (long long int)(1e9 + 7);
}
long long int lpow(long long int a, long long int b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0) {
    long long int memo = lpow(a, b / 2);
    return memo * memo;
  } else
    return lpow(a, b - 1) * a;
}
long long int gcd(long long int a, long long int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
vector<long long int> kaijo_memo;
long long int kaijo(long long int n) {
  if (kaijo_memo.size() > n) return kaijo_memo[n];
  if (kaijo_memo.size() == 0) kaijo_memo.push_back(1);
  while (kaijo_memo.size() <= n)
    kaijo_memo.push_back(kaijo_memo[kaijo_memo.size() - 1] * kaijo_memo.size() %
                         (long long int)(1e9 + 7));
  return kaijo_memo[n];
}
vector<long long int> gyaku_kaijo_memo;
long long int gyaku_kaijo(long long int n) {
  if (gyaku_kaijo_memo.size() > n) return gyaku_kaijo_memo[n];
  if (gyaku_kaijo_memo.size() == 0) gyaku_kaijo_memo.push_back(1);
  while (gyaku_kaijo_memo.size() <= n)
    gyaku_kaijo_memo.push_back(
        gyaku_kaijo_memo[gyaku_kaijo_memo.size() - 1] *
        mpow(gyaku_kaijo_memo.size(), (long long int)(1e9 + 7) - 2) %
        (long long int)(1e9 + 7));
  return gyaku_kaijo_memo[n];
}
long long int nCr(long long int n, long long int r) {
  if (n == r) return 1;
  if (n < r || r < 0) return 0;
  long long int ret = 1;
  if (n <= 1e7) {
    ret *= kaijo(n);
    ret %= (long long int)(1e9 + 7);
    ret *= gyaku_kaijo(r);
    ret %= (long long int)(1e9 + 7);
    ret *= gyaku_kaijo(n - r);
    ret %= (long long int)(1e9 + 7);
  } else {
    for (int i = 0; i < (int)(r); i++) {
      ret *= n - i;
      ret %= (long long int)(1e9 + 7);
      ret *= mpow(r - i, (long long int)(1e9 + 7) - 2);
      ret %= (long long int)(1e9 + 7);
    }
  }
  return ret;
}
int n;
void saiki(bitset<10> bs, char c, vector<string>& ans, string& s) {
  if (bs.count() == n) {
    ans.push_back(s);
    return;
  }
  for (int bit = 0; bit < (int)(1 << n); bit++) {
    if (bit == 0) continue;
    bitset<10> add(bit);
    if ((bs & add).count() > 0) continue;
    bool ok = false;
    for (int i = 0; i < (int)(n); i++) {
      if (add[i]) {
        s[i] = c;
        ok = true;
      }
      if (!ok && s[i] == '*') {
        break;
      }
    }
    if (!ok) continue;
    saiki((bs | add), (c + 1), ans, s);
    for (int i = 0; i < (int)(n); i++) {
      if (add[i]) s[i] = '*';
    }
  }
}
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(15);
  cin >> n;
  vector<string> ans;
  string s = "";
  for (int i = 0; i < (int)(n); i++) {
    s += "*";
  }
  saiki(bitset<10>(0), 'a', ans, s);
  for (int i = 0; i < (int)(ans.size()); i++) {
    cout << ans[i] << endl;
  }
}
