#include <cassert>
#include <unordered_set>
#include <vector>
#include <iostream>
using namespace std;

string ans[] = {"", "", "", "",
"aacd"
"bbcd"
"efgg"
"efhh",
"abc.."
"abc.."
"deeff"
"d.ghh"
"iigjj",
"abc..."
"abc..."
"d.eeff"
"dghh.."
".g.ijj"
"kk.ill",
"abc...."
"abc...."
"def...."
"def...."
"g..hhii"
"g..jjkk"
".llmmnn"};

int main() {
    int n; cin >> n;
    if (n <= 2) { cout << "-1\n"; return 0; }
    if (n == 3) { cout << "aa.\n..b\n..b\n"; return 0; }
    vector<string> s(n, string(n, '.'));
    int offset = 4 + n % 4;
    for (int x = 0; x < offset; x++)
        for (int y = 0; y < offset; y++) s[x][y] = ans[offset][offset*x+y];
    for (int i = offset; i < n; i += 4) {
        for (int x = 0; x < 4; x++)
            for (int y = 0; y < 4; y++) s[i+x][i+y] = ans[4][4*x+y];
    }
    for (string l : s) cout << l << endl;

    // // check
    // unordered_set<char> st;
    // for (int x = 0; x < n; x++) if (s[x][0] != '.') st.insert(s[x][0]);
    // int k = st.size();
    // assert (k != 0);

    // for (int x = 0; x < n; x++) {
    //     st.clear();
    //     for (int y = 0; y < n; y++) if (s[x][y] != '.') st.insert(s[x][y]);
    //     assert (st.size() == k);
    // }
    // for (int y = 0; y < n; y++) {
    //     st.clear();
    //     for (int x = 0; x < n; x++) if (s[x][y] != '.') st.insert(s[x][y]);
    //     assert (st.size() == k);
    // }
    // cerr << "OK" << endl;
}
