#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using vi = vector<int>;
using vl = vector<ll>;

using _loop_int = int;
#define REP(i,n) for(_loop_int i=0; i<(_loop_int)(n); i++)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a); i<(_loop_int)(b); i++)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1; i>=(_loop_int)(a); i--)

#define CHMIN(a,b) (a)=min((a),(b))
#define CHMAX(a,b) (a)=max((a),(b))
#define ALL(v) (v).begin(),(v).end()

#define DEBUG(x) cerr<<#x<<": "<<(x)<<endl
#define DEBUG_VEC(v) cerr<<#v<<": ";REP(__i,(v).size())cerr<<((v)[__i])<<", ";cerr<<endl

const ll MOD = 1000000007ll;

char mp[1252][1252];

char gc(int i, int j){
    return 'a' + (i%5)*5 + (j%5);
}

void u(int ai, int aj, int bi, int bj,bool flag = false){
    mp[ai][aj] = mp[bi][bj] = gc(ai,aj);
    if(flag){
        mp[ai][aj] = mp[bi][bj] = 'z';
    }
}
void tate(int i, int j,bool flag=false){
    u(i,j,i+1,j,flag);
}
void yoko(int i, int j,bool flag = false){
    u(i,j,i,j+1,flag);
}

void solve(int n){
    if(n==4){
        tate(0,0);
        tate(0,1);
        yoko(0,2);
        yoko(1,2);
        yoko(2,0);
        yoko(3,0);
        tate(2,2);
        tate(2,3);
        return;
    }
    if(n==5){
        yoko(0,0);
        tate(0,2);
        yoko(2,1);
        tate(1,0);
        yoko(0,3);
        yoko(1,3);
        yoko(2,3);
        tate(3,0);
        tate(3,1);
        tate(3,2);
        return;
    }
    if(n==6){
        tate(0,2);
        tate(0,3);
        yoko(0,4);
        tate(1,5);
        tate(2,0);
        yoko(2,1);
        tate(3,2);
        yoko(3,3);
        yoko(4,0);
        tate(4,3);
        yoko(5,0);
        yoko(5,4,true);
        return;
    }
    if(n==7){
        tate(0,2); yoko(2,0);
        REP(i,2)REP(j,3)tate(3+2*i,j,i==1&&j==2);
        REP(i,2)REP(j,3)yoko(j,3+2*i,i==1&&j==2);
        return;
    }
    if(n%2==0){
        solve(n/2);
        REP(i,n/2)REP(j,n/2){
            mp[i+n/2][j] = mp[i+n/2][j+n/2] = mp[i][j+n/2] = mp[i][j];
        }
        return;
    }
    assert(n%2==1 && n>=9);
    int y = n-4;
    int x = n-4;
    tate(y+0,x+0);
    tate(y+0,x+1);
    yoko(y+0,x+2);
    yoko(y+1,x+2);
    yoko(y+2,x+0);
    yoko(y+3,x+0);
    tate(y+2,x+2);
    tate(y+2,x+3);
    solve(n-4);
    return;
}

int dat[1252*1252];
int root(int x){
    return dat[x] < 0 ? x : dat[x] = root(dat[x]);
}
void unite(int a, int b){
    a=root(a); b=root(b);
    if(a==b)return;
    dat[a] += dat[b];
    dat[b] = a;
    return;
}

int main(){
    // FOR(n,4,1001){
    //     REP(i,n)fill(mp[i], mp[i]+n, '.');
    //     solve(n);
    //     vi r(n,0), c(n,0);
    //     fill(dat, dat+n*n, -1);
    //     REP(i,n)REP(j,n){
    //         if(mp[i][j] == '.')continue;
    //         if(mp[i][j] == mp[i+1][j]){
    //             unite(i*n+j, (i+1)*n+j);
    //             c[i]++; c[i+1]++;
    //             r[j]++;
    //         }
    //         if(mp[i][j] == mp[i][j+1]){
    //             unite(i*n+j, i*n+j+1);
    //             c[i]++;
    //             r[j]++; r[j+1]++;
    //         }
    //         if(-dat[i*n+j] > 2){
    //             printf("error on %d\n", n);
    //             REP(k,n)puts(mp[k]);
    //             exit(0);
    //         }
    //     }
    //     int v = r[0];
    //     bool ok = true;
    //     if(count(ALL(r), v) != n)ok = false, DEBUG("1");
    //     if(count(ALL(c), v) != n)ok = false, DEBUG("2");
    //     if(v==0)ok = false, DEBUG("3");
    //     if(!ok){
    //         printf("WA on %d\n", n);
    //         REP(k,n)puts(mp[k]);
    //         exit(0);
    //     }
    // }
    // return 0;

    int n;
    scanf("%d", &n);
    if(n==2){
        puts("-1");
        return 0;
    }
    if(n==3){
        puts("aa.");
        puts("..b");
        puts("..b");
        return 0;
    }
    REP(i,n)fill(mp[i], mp[i]+n, '.');
    solve(n);
    REP(i,n)puts(mp[i]);
    return 0;
}


Measured memory_bytes: 4480