#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
//typedef vector<vector<ll>> Graph;

const ll mod = 1e9 + 7;
//const ll mod = 998244353;

#define REP(i,n) for(ll i=0;i<(ll)n;i++)
#define dump(x)  cerr << #x << " = " << (x) << endl;
#define spa << " " <<
#define fi first
#define se second

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }

template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){
os << "(" << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator << (ostream& os, const vector<T> v){
for(int i = 0; i < (int)v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){
for(int i = 0; i < (int)v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}

template<typename T> void debug(vector<vector<T>>&v,ll h,ll w){for(ll i=0;i<h;i++)
{cerr<<v[i][0];for(ll j=1;j<w;j++)cerr spa v[i][j];cerr<<endl;}};
template<typename T> void debug(vector<T>&v,ll n){if(n!=0)cerr<<v[0];
for(ll i=1;i<n;i++)cerr spa v[i];
cerr<<endl;};

string num2bit(ll num, ll len){
	string bit = "";
	REP(i, len){
	bit += char('0'+(num>>i & 1));
	}
	return bit;
}

char kai3[3][3] = {
	{'.', 'a', 'a'}, 
	{'b', '.', '.'}, 
	{'b', '.', '.'}
};

char kai4[4][4] = {
	{'c', 'c', 'b', 'd'},
	{'e', 'e', 'b', 'd'},
	{'g', 'f', 'a', 'a'},
	{'g', 'f', 'h', 'h'}
};

char kai5[5][5] = {
	{'j', '.', 'c', 'c', 'g'},
	{'j', 'b', '.', '.', 'g'},
	{'.', 'b', 'i', 'a', 'a'},
	{'h', 'h', 'i', '.', 'e'},
	{'f', 'f', 'd', 'd', 'e'}
};

char kai6[6][6] = {
	{'j', 'b', 'b', '.', 'a', 'a'},
	{'j', '.', '.', 'c', 'l', '.'},
	{'e', 'e', '.', 'c', 'l', '.'},
	{'d', 'd', 'f', 'f', '.', 'g'},
	{'.', '.', 'i', 'k', '.', 'g'},
	{'.', '.', 'i', 'k', 'h', 'h'}
};

char kai7[7][7] = {
	{'.', 'i', 'c', '.', '.', 'g', 'g'},
	{'.', 'i', 'c', 'a', 'a', '.', '.'},
	{'m', 'm', '.', '.', 'e', 'n', 'n'},
	{'.', '.', '.', '.', 'e', 'l', 'b'},
	{'k', 'k', '.', '.', '.', 'l', 'b'},
	{'d', '.', 'j', 'j', 'f', '.', '.'},
	{'d', '.', 'h', 'h', 'f', '.', '.'}
};

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

	ll N;
	cin >> N;
	if(N<=2){
		cout << -1 << endl;
		return 0;
	}

	if(N==3){
		REP(i, 3){
			REP(j, 3){
				cout << kai3[i][j];
			}
			cout << endl;
		}
	}else{
		ll NN = N;
		ll now = 0;
		vector<vector<char>> res(N, vector<char>(N, '.'));
		while(N>7){
			REP(i, 4){
				REP(j, 4){
					res[now+i][now+j] = kai4[i][j];
				}
			}
			now += 4;
			N -= 4;
		}

		if(N==4){
			REP(i, N){
				REP(j, N){
					res[now+i][now+j] = kai4[i][j];
				}
			}
		}

		if(N==5){
			REP(i, N){
				REP(j, N){
					res[now+i][now+j] = kai5[i][j];
				}
			}
		}

		if(N==6){
			REP(i, N){
				REP(j, N){
					res[now+i][now+j] = kai6[i][j];
				}
			}
		}

		if(N==7){
			REP(i, N){
				REP(j, N){
					res[now+i][now+j] = kai7[i][j];
				}
			}
		}

		REP(i, NN){
			REP(j, NN){
				cout << res[i][j];
			}
			cout << endl;
		}
	}
	return 0;
}

Measured memory_bytes: 2304