#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using V = vector<int>;
using Vll = vector<ll>;
using Vld = vector<ld>;
using Vbo = vector<bool>;
using VV = vector<V>;
using VVll = vector<Vll>;
using VVld = vector<Vld>;
using VVbo = vector<Vbo>;
using P = pair<int, int>;
using Pll = pair<ll, ll>;
using Pld = pair<ld, ld>;
#define rep2(i, m, n) for(ll i=int(m); i<int(n); ++i)
#define drep2(i, m, n) for(ll i=int(m)-1; i>=int(n); --i)
#define rep(i, n) rep2(i, 0, n)
#define drep(i, n) drep2(i, n, 0)
#define all(a) a.begin(), a.end()
struct fast_ios { fast_ios(){ cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_;
template<typename T> inline bool chmin(T &a, T b) { if (a > b) { a = b; return true; } return false; }
template<typename T> inline bool chmax(T &a, T b) { if (a < b) { a = b; return true; } return false; }
template<typename T1, typename T2> istream &operator>>(istream &is, pair<T1, T2> &p) { is >> p.first >> p.second; return is; }
template<typename T1, typename T2> ostream &operator<<(ostream &os, const pair<T1, T2> &p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
template<typename T> istream &operator>>(istream &is, vector<T> &v) { for (auto &e : v) is >> e; return is; }
template<typename T> ostream &operator<<(ostream &os, const vector<T> &v) { for (auto &e : v) os << e << "\n"; return os; }
template<typename T> inline int count_between(vector<T> &a, T l, T r) { return lower_bound(all(a), r) - lower_bound(all(a), l); } // [l, r)
inline int Log2(ll x) { int k; for (k = 0; x > 0; ++k) x >>= 1; return k; } // number of binary digits
const int INF  = 1<<30;
const ll INFll = 1ll<<62;
const ld EPS   = 1e-10;
const int MOD  = int(1e9)+7;


int main() {
  int n; cin >> n;

  if (n == 2) {
    cout << -1 << "\n";
    return 0;
  }
  else if (n == 3) {
    cout << "a..\n";
    cout << "a..\n";
    cout << ".bb\n";
    return 0;
  }

  vector<string> b(4);
  b[0] = "aabc";
  b[1] = "ddbc";
  b[2] = "efgg";
  b[3] = "efhh";

  vector<string> A(n);
  int m = n/4-1;

  rep(k, m) rep(i, 4) {
    A[4*k+i] = string(4*k, '.');
    A[4*k+i] += b[i];
    A[4*k+i] += string(n-4*(k+1), '.');
  }

  if (n%4 == 0) {
    int k = m;
    rep(i, 4) {
      A[4*k+i] = string(4*k, '.');
      A[4*k+i] += b[i];
      A[4*k+i] += string(n-4*(k+1), '.');
    }
  }
  else if (n%4 == 1) {
    A[n-5] = string(n-5, '.') + "aabbc";
    A[n-4] = string(n-5, '.') + "de..c";
    A[n-3] = string(n-5, '.') + "de..f";
    A[n-2] = string(n-5, '.') + "h.ggf";
    A[n-1] = string(n-5, '.') + "hiijj";
  }
  else if (n%4 == 2) {
    A[n-6] = string(n-6, '.') + "aabe..";
    A[n-5] = string(n-6, '.') + "c.be..";
    A[n-4] = string(n-6, '.') + "cdd.ff";
    A[n-3] = string(n-6, '.') + "e..aab";
    A[n-2] = string(n-6, '.') + "e..c.b";
    A[n-1] = string(n-6, '.') + ".ffcdd";
  }
  else if (n%4 == 3) {
    A[n-7] = string(n-7, '.') + "aab...e";
    A[n-6] = string(n-7, '.') + "c.b...e";
    A[n-5] = string(n-7, '.') + "cdd...f";
    A[n-4] = string(n-7, '.') + "...aabf";
    A[n-3] = string(n-7, '.') + "...c.bg";
    A[n-2] = string(n-7, '.') + "...cddg";
    A[n-1] = string(n-7, '.') + "hhiijj.";
  }

  cout << A;
  return 0;
}


Measured memory_bytes: 2688