#include <bits/stdc++.h>
using namespace std;
#define reps(i,s,n) for(int i = s; i < n; i++)
#define rep(i,n) reps(i,0,n)
#define Rreps(i,n,e) for(int i = n - 1; i >= e; --i)
#define Rrep(i,n) Rreps(i,n,0)
#define ALL(a) a.begin(), a.end()
#define fi first
#define se second
#define endl "\n"
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
#define traceV(v) for(auto x:v)cout<<x<<" ";cout<<endl
#define traceM(mp) for(auto x:mp)cout<<x.first<<" "<<x.second<<endl

//const ll MOD = 998244353;
const ll MOD = (1e+9) + 7;
const ll INF = 2e+9 + 10;
typedef pair<ll, ll> P;

//解答の文字列の範囲は，0000~0123であり，その範囲の文字列の型を判定して，新規の型であれば，保持し，最後に列挙する．

class Radix {
private:
    const char* s;
    int a[128];
public:
    Radix(const char* s = "0123456789ABCDEF") : s(s) {
      int i;
      for(i = 0; s[i]; ++i)
        a[(int)s[i]] = i;
    }
    std::string to(long long p, int q) {
      int i;
      if(!p)
        return "0";
      char t[64] = { };
      for(i = 62; p; --i) {
        t[i] = s[p % q];
        p /= q;
      }
      return std::string(t + i + 1);
    }
    std::string to(const std::string& t, int p, int q) {
      return to(to(t, p), q);
    }
    long long to(const std::string& t, int p) {
      int i;
      long long sm = a[(int)t[0]];
      for(i = 1; i < (int)t.length(); ++i)
        sm = sm * p + a[(int)t[i]];
      return sm;
    }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N;
  cin >> N;

  if(N==1){cout<<'a'<<endl;return 0}

  vector<int> v1(N), v2(N);
  rep(i, N) v2[i]=i;

  vector<vector<bool>> mt;

  for(int i=0; v1!=v2; i++) {
    // 10進数iをN進数numに変換
    Radix r;
    string s = r.to(i, N);
    istringstream ss = istringstream(s);
    int num = atoi(s.c_str());
    ss >> num;

    // numを配列に格納
    rep(i,N)v1[i]=0;  // 初期化
    for(int j=0; num;) {
      v1[j] = num%10;
      num/=10;
      j++;
    }
    reverse(ALL(v1));

    // v1の型を調べる
    vector<bool> v3;
    for(int j=0; j<N; j++) {
      for(int k=j+1; k<N; k++) {
        v3.push_back(v1[j]==v1[k]);
      }
    }

    // v1の型が新規のものであればmtに格納して，v1に対応するアルファベット列を出力
    if(find(ALL(mt), v3) == mt.end()) {   // 存在していないならば
      mt.push_back(v3);

      for(int j=0; j<N; j++) {
        cout << (char)(v1[j]+'a');
      }
      cout << endl;
    }
  }

  return 0;
}

