#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cassert>

#include<cmath>
#include<functional>
#include<algorithm>

#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<unordered_set>
#include<map>
#include<unordered_map>
#include<bitset>
#include<tuple>

#define TEST {IS_TEST=true;}
#define fi first
#define se second
#define pb(x) {push_back(x);}

using namespace std;
using ll = int_fast64_t;
using v_b = vector <bool>;
using v_ll = vector <ll>;
using str = string;
using v_str = vector <string>;
using p_ll = pair < ll,ll >;
using vv_b = vector < v_b >;
using vv_ll = vector < v_ll >;
using vp_ll = vector < p_ll >;
using vvv_ll = vector < vv_ll >;
using vvp_ll = vector < vp_ll >;

using ld = long double;
using v_ld = vector <ld>;
using vv_ld = vector<v_ld>;

bool IS_TEST=false;
ll ll_min64=1LL<<63;
ll ll_max64=~ll_min64;
ll ll_min32=1LL<<31;
ll ll_max32=~ll_min32;

ll MOD = 1000000007;

/*displaying functions for debug*/
template<class T> void show2(const T &x){cout << x;}
template<class T1,class T2> void show2(const pair<T1,T2> &x){
  cout << "{" << show2(x.first) << "," << show2(x.second) << "}";
}
template<class T> void show(const T &x){
  if (!IS_TEST) return;
  show2(x); cout <<endl;
}
template<class T> void v_show(const T &v, ll n=-1){
  if (!IS_TEST) return;
  auto itr=v.begin(); ll m=n;
  while(itr!=v.end() && m!=0 ){ show2(*itr); cout << " "; itr++; m--;}
  cout << endl;
}
template<class T> void vv_show(const T &v, ll n=-1){
  if (!IS_TEST) return;
  cout << "--------------------------------\n";
  auto itr=v.begin(); ll m=n;
  while(itr!=v.end() && m!=0 ){ v_show(*itr,n); itr++; m--;}
  cout << "--------------------------------" << endl;
}
/*--------------------------------*/

/*loading integers*/
void load(ll& x1){ cin >> x1; }
void load(ll& x1,ll& x2){ cin >> x1 >> x2; }
void load(ll& x1,ll& x2,ll& x3){ cin >> x1 >> x2 >> x3; }
void load(ll& x1,ll& x2,ll& x3,ll& x4){ cin >> x1 >> x2 >> x3 >> x4; }
void v_load(ll n, v_ll& v1, ll head=0, ll tail=0, ll init=0){
    ll m=n+head+tail; v1.assign(m,init);
    for (ll i=0;i<n;i++){ cin >> v1[i+head]; }
}
void v_load(ll n, v_ll& v1 ,v_ll& v2, ll head=0, ll tail=0, ll init=0){
    ll m=n+head+tail; v1.assign(m,init); v2.assign(m,init);
    for (ll i=0;i<n;i++){ cin >> v1[i+head] >> v2[i+head]; }
}
void v_load(ll n, v_ll& v1 ,v_ll& v2, v_ll& v3, ll head=0, ll tail=0, ll init=0){
    ll m=n+head+tail; v1.assign(m,init); v2.assign(m,init); v3.assign(m,init);
    for (ll i=0;i<n;i++){ cin >> v1[i+head] >> v2[i+head] >> v3[i+head]; }
}
void v_load(ll n, v_ll& v1 ,v_ll& v2, v_ll& v3, v_ll& v4, ll head=0, ll tail=0, ll init=0){
    ll m=n+head+tail; v1.assign(m,init); v2.assign(m,init); v3.assign(m,init); v4.assign(m,init);
    for (ll i=0;i<n;i++){ cin >> v1[i+head] >> v2[i+head] >> v3[i+head] >> v4[i+head]; }
}
/*--------------------------------*/

v_ll ll_mg(ll x1=ll_max64, ll x2=ll_max64, ll x3=ll_max64, ll x4=ll_max64){
    v_ll x{x1,x2,x3,x4};
    sort(x.begin(),x.end());
    return x;
}

template<class T> void ch_max(T& x,const T& y){ if (x>=y) return; x=y; }
template<class T> void ch_min(T& x,const T& y){ if (x<=y) return; x=y; }
template<class T,class S> void ch_max(T& x,S& xx,const T& y,const S& yy){
  if (x>=y) return; x=y; xx=yy;
}
template<class T,class S> void ch_min(T& x,S& xx,const T& y,const S& yy){
  if (x<=y) return; x=y; xx=yy;
}

template<class T> void quit(T x){cout << x << endl; exit(0);}

ll rem(ll x,ll y){ ll z=x%y; return z>=0?z:z+y; }

ll N;
vector<string>  M;

void write3(ll x,ll y){
        M[x][y]=    'a';
        M[x+1][y]=  'a';
        M[x+2][y+1]='a';
        M[x+2][y+2]='a';
}

void write32(ll x,ll y){
        M[x][y]=    'g';
        M[x+1][y]=  'g';
        M[x+2][y]='h';
        M[x+2][y+1]='h';
        M[x+2][y+2]=    'i';
        M[x+1][y+2]=  'i';
        M[x][y+1]='j';
        M[x][y+2]='j';
}

void write4(ll x,ll y){
  M[x+0][y+0]='w';
  M[x+0][y+1]='w';
  M[x+0][y+2]='y';
  M[x+0][y+3]='z';
  M[x+1][y+0]='x';
  M[x+1][y+1]='x';
  M[x+1][y+2]='y';
  M[x+1][y+3]='z';
  M[x+2][y+0]='y';
  M[x+2][y+1]='z';
  M[x+2][y+2]='w';
  M[x+2][y+3]='w';
  M[x+3][y+0]='y';
  M[x+3][y+1]='z';
  M[x+3][y+2]='x';
  M[x+3][y+3]='x';
}

void write6(ll x,ll y){
  write32(x,y);
  write3(x,y+3);
  write3(x+3,y);
  write32(x+3,y+3);
}

void write7(ll x,ll y){
  write3(x,y);
  write3(x,y+3);
  write3(x+3,y);
  write3(x+3,y+3);
  M[x+6][y]='k';
  M[x+6][y+1]='k';
  M[x+6][y+2]='l';
  M[x+6][y+3]='l';
  M[x+6][y+4]='m';
  M[x+6][y+5]='m';
  M[x+0][y+6]='k';
  M[x+1][y+6]='k';
  M[x+2][y+6]='l';
  M[x+3][y+6]='l';
  M[x+4][y+6]='m';
  M[x+5][y+6]='m';
}


int main(){
    load(N);
    M.assign(N,string(N,'.'));
    
    if (N==2) quit(-1);
    if (N==5) {
      cout <<"abbcc\n";
      cout <<"a.eff\n";
      cout <<"ddegg\n";
      cout <<"hij..\n";
      cout <<"hij..\n";
      return 0;
    }
    if (N==10) {
      write4(0,0);
      write6(4,4);
    }
    else if (N==13) {
      write7(0,0);
      write6(7,7);
    }
    else if (N==17) {
      write4(0,0);
      write6(4,4);
      write7(10,10);
    }
    else if(N%3==0){
      for (ll i=0;i<N/3;i++){
        write3(i*3,i*3);
      }
    }
    else if(N%4==0){
      for (ll i=0;i<N/4;i++){
        write4(i*4,i*4);
      }
    }
    else if(N%4==1 && N>=21){
      write7(0,0);
      write7(7,7);
      write7(14,14);
      for (ll i=21;i<N;i+=4){
        write4(i,i);
      }
    }
    else if(N%4==2 && N>=14){
      write7(0,0);
      write7(7,7);
      for (ll i=14;i<N;i+=4){
        write4(i,i);
      }
    }
    else if(N%4==3 && N>=7){
      write7(0,0);
      for (ll i=7;i<N;i+=4){
        write4(i,i);
      }
    }
    for(ll i=0;i<N;i++){
      cout << M[i] << endl;
    }
}




Measured memory_bytes: 2304