#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) begin(v),end(v)
template<typename A, typename B> inline bool chmax(A & a, const B & b) { if (a < b) { a = b; return true; } return false; }
template<typename A, typename B> inline bool chmin(A & a, const B & b) { if (a > b) { a = b; return true; } return false; }
using ll = long long;
using pii = pair<int, int>;
constexpr ll INF = 1ll<<30;
constexpr ll longINF = 1ll<<60;
constexpr ll MOD = 1000000007;
constexpr bool debug = false;
//---------------------------------//

int main() {
	int N;
	cin >> N;
	
	vector<string> ans;
	
	// auto func = [&]() {
	// 	int as = -1, an = -1;
	// 	REP(i, 1 << N) FOR(j, i + 1, 1 << N) {
	// 		int s = 0, n = 0;
	// 		for (auto & str : ans) {
	// 			s += str[i] == str[j];
	// 			n += str[i] != str[j];
	// 		}
	// 		if (as == -1) {
	// 			as = s;
	// 			an = n;
	// 		}
	// 		else {
	// 			if (as != s || an != n) return false;
	// 			//cout << i << ", " << j << ": as = " << s << ", s = " << s << ": an = " << an << ", n = " << n << endl;
	// 			// assert(as == s);
	// 			// assert(an == n);
	// 		}
	// 	}
	// 	return true;
	// };
	
	// vector<string> op;
	// REP(i, 1 << ((1 << N) - 1)) {
	// 	int pcnt = 0;
	// 	REP(j, (1 << N) - 1) pcnt += i >> j & 1;
	// 	if (pcnt != (1 << (N - 1)) - 1) continue;
	// 	string s(1 << N, 'B');
	// 	s[0] = 'A';
	// 	REP(j, (1 << N) - 1) if (i >> j & 1) s[j + 1] = 'A';
	// 	op.emplace_back(s);
	// }
	
	// vector<int> cnt(1 << N);
	
	// auto dfs = [&](auto self, int d, int p) {
	// 	if (d == (1 << N) - 1) {
	// 		if (func()) {
	// 			puts("answer! : ");
	// 			sort(ALL(ans));
	// 			for (auto s : ans) cout << s << endl;
	// 			return;
	// 		}
	// 		return;
	// 	}
	// 	FOR(i, p, op.size()) {
	// 		bool ok = true;
	// 		FOR(j, 1, op[i].size()) {
	// 			if (op[i][j] == 'A') ++cnt[j];
	// 			ok &= cnt[j] <= (1 << (N - 1)) - 1;
	// 		}
	// 		if (ok) {
	// 			ans.emplace_back(op[i]);
	// 			self(self, d + 1, i + 1);
	// 			ans.pop_back();
	// 		}
			
	// 		FOR(j, 1, op[i].size()) if (op[i][j] == 'A') --cnt[j];
	// 	}
	// };
	// dfs(dfs, 0, 0);
	
	REP(i, N) {
		vector<string> nex;
		nex.emplace_back(string(1 << i, 'A') + string(1 << i, 'B'));
		for (auto & s : ans) {
			nex.emplace_back(s + s);
			string rev = s;
			for (char & c : rev) c = c == 'A' ? 'B' : 'A';
			nex.emplace_back(s + rev);
		}
		swap(ans, nex);
	}
	
	cout << ans.size() << endl;
	for (auto & s : ans) cout << s << '\n';
}
#pragma GCC optimize("O3")

#include "bits/stdc++.h"

#define sz(x) (int)(x).size()
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;
    cout << (1<<n)-1 << "\n";
    for(int i=1; i<=(1<<n)-1; i++) {
        for(int j=0; j<(1<<n); j++)
            cout << (__builtin_popcount(i & (j+1)) % 2 ? 'A' : 'B');
        cout << "\n";
    }

    return 0;
}
