/*
TASK: lab
LANG: C
*/
#include <stdio.h>

#define N	64
#define M	4000000

char c[N][N][N];
char d[N][N][N];
int n;

int rx, ry, rz;
int jx, jy, jz;
char ra, rb;

char p[41*41*41*100];

int q[M];
int qb, qe;

char m[M];

void read_data() {
	int i, j;
	char junk[128];
	
	scanf("%d", &n);
	scanf("%d%d%d", &rx, &ry, &rz);
	scanf("%d%d%d", &jx, &jy, &jz);
	fgets(junk, 128, stdin);
	scanf("%c%c", &ra, &rb);
	fgets(junk, 128, stdin);

	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			fgets(c[i][j], N, stdin);
				
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			fgets(d[i][j], N, stdin);
}

int ep(int x, int y, int z, char a, char b) {
	return (((x*41 + y)*41 + z)*10 + a-'A')*10 + b-'A';
}

void dp(int c, int *x, int *y, int *z, char *a, char *b) {
	*b = c%10 + 'A'; c /= 10;
	*a = c%10 + 'A'; c /= 10;
	*z = c%41; c /= 41;
	*y = c%41; c /= 41;
	*x = c%41;
}

void print_sol(int cp) {
	int i;
	int cx, cy, cz;
	char ca, cb;
	
	int mc;

	mc = 0;
	while (p[cp] != -1) {
		dp(cp, &cx, &cy, &cz, &ca, &cb);
		if ((p[cp] >= 'A') && (p[cp] <= 'J')) {
			m[mc++] = p[cp];
			cp = ep(cx, cy, cz, m[mc-1], cb);
		} else if ((p[cp] >= 'a') && (p[cp] <= 'j')) {
			m[mc++] = p[cp] - 32;
			cp = ep(cx, cy, cz, ca, m[mc-1]);
		} else {
			switch(p[cp]) {
				case 'X': cx--; break;
				case 'Y': cy--; break;
				case 'Z': cz--; break;
				case 'U': cx++; break;
				case 'V': cy++; break;
				case 'W': cz++; break;
			}
			m[mc++] = p[cp];
			cp = ep(cx, cy, cz, ca, cb);
		}
	}

	printf("%d\n", mc);
	for (i = mc-1; i >= 0; i--)
		printf("%c", m[i]);
        printf("\n");
}

void solve() {
	int cp;
	int cx, cy, cz;
	char ca, cb;

	cp = ep(rx-1, ry-1, rz-1, ra, rb);
	jx--; jy--; jz--;
	p[cp] = -1;

	qb = qe = 0;
	q[qe++] = cp;

	while (qb != qe) {
		cp = q[qb];
		qb++;
		qb %= M;
		
		dp(cp, &cx, &cy, &cz, &ca, &cb);

		if ((cx == jx) && (cy == jy) && (cz == jz))
			break;
		
		// move x+1
		if ((cx < n-1) &&
		    ((c[cz][cx+1][cy] == ca) || (c[cz][cx+1][cy] == cb))) {
			cp = ep(cx+1, cy, cz, ca, cb);
			if (p[cp] == 0) {
				p[cp] = 'X';
				q[qe++] = cp;
				qe %= M;
			}
		}
		// move x-1
		if ((cx > 0) &&
		    ((c[cz][cx-1][cy] == ca) || (c[cz][cx-1][cy] == cb))) {
			cp = ep(cx-1, cy, cz, ca, cb);
			if (p[cp] == 0) {
				p[cp] = 'U';
				q[qe++] = cp;
				qe %= M;
			}
		}

		// move y+1
		if ((cy < n-1) &&
		    ((c[cz][cx][cy+1] == ca) || (c[cz][cx][cy+1] == cb))) {
			cp = ep(cx, cy+1, cz, ca, cb);
			if (p[cp] == 0) {
				p[cp] = 'Y';
				q[qe++] = cp;
				qe %= M;
			}
		}

		// move y-1
		if ((cy > 0) &&
		    ((c[cz][cx][cy-1] == ca) || (c[cz][cx][cy-1] == cb))) {
			cp = ep(cx, cy-1, cz, ca, cb);
			if (p[cp] == 0) {
				p[cp] = 'V';
				q[qe++] = cp;
				qe %= M;
			}
		}

		// move z+1
		if ((cz < n-1) &&
		    ((c[cz+1][cx][cy] == ca) || (c[cz+1][cx][cy] == cb))) {
			cp = ep(cx, cy, cz+1, ca, cb);
			if (p[cp] == 0) {
				p[cp] = 'Z';
				q[qe++] = cp;
				qe %= M;
			}
		}

		// move z-1
		if ((cz > 0) &&
		    ((c[cz-1][cx][cy] == ca) || (c[cz-1][cx][cy] == cb))) {
			cp = ep(cx, cy, cz-1, ca, cb);
			if (p[cp] == 0) {
				p[cp] = 'W';
				q[qe++] = cp;
				qe %= M;
			}
		}

		// change card a
                if (d[cz][cx][cy] != 'O') {
			cp = ep(cx, cy, cz, d[cz][cx][cy], cb);
			if (p[cp] == 0) {
				p[cp] = ca;
				q[qe++] = cp;
				qe %= M;
			}
		}
		
		// change card b
                if (d[cz][cx][cy] != 'O') {
			cp = ep(cx, cy, cz, ca, d[cz][cx][cy]);
                        if (p[cp] == 0) {
				p[cp] = cb+32;
				q[qe++] = cp;
				qe %= M;
			}
		}
	}

	print_sol(cp);
}

int main() {
	read_data();
	solve();
	return 0;
}
