#include <bits/stdc++.h>
using namespace std;
const int MAXN = 15;
struct Uf {
  int p[MAXN];
  char s[MAXN];
  void clear() {
    for (int i = (0); i < int(MAXN); i++) p[i] = i;
    for (int i = (0); i < int(MAXN); i++) s[i] = 'A';
  }
  int find(int x) {
    if (x == p[x]) return x;
    return p[x] = find(p[x]);
  }
  void join(int a, int b) { p[find(a)] = find(b); }
  char set(int a, char b) {
    a = find(a);
    if (s[a] != 'A') return s[a];
    s[a] = b;
    return b;
  }
};
Uf U;
int n;
vector<pair<int, int> > v;
vector<string> ans;
int main() {
  cin >> n;
  for (int i = (0); i < int(2); i++) {
    for (int j = (i + 1); j < int(n); j++) v.push_back({i, j});
  }
  int N = (1 << (int)v.size());
  for (int mask = (0); mask < int(N); mask++) {
    U.clear();
    for (int i = (0); i < int((int)v.size()); i++) {
      if (mask & (1 << i)) {
        U.join(v[i].first, v[i].second);
      }
    }
    bool losa = 0;
    for (int i = (0); i < int((int)v.size()); i++) {
      if ((!(mask & (1 << i))) && U.find(v[i].first) == U.find(v[i].second))
        losa = 1;
    }
    if (losa) continue;
    string tmp = "";
    char c = 'a';
    for (int i = (0); i < int(n); i++) {
      char last = U.set(i, c);
      tmp += last;
      if (last == c) c++;
    }
    ans.push_back(tmp);
  }
  sort((ans).begin(), (ans).end());
  ans.erase(unique((ans).begin(), (ans).end()), ans.end());
  for (auto t : ans) cout << t << endl;
  return 0;
}
