/*
TASK:lab
LANG:C
*/

#include <stdio.h>
#include <stdlib.h>

#define MAXN 40
#define MAXL 10
#define CODEPOS(x,y,z) (1600*(x) + 40*(y) + (z))
#define CODECOL(a,b)   (10*(a) + (b))

typedef struct
  {
    unsigned short pos;
    char col;
  } SPos;

char visited[MAXN][MAXN][MAXN][MAXL][MAXL];
int rx,ry,rz,jx,jy,jz,ra,rb;
int n;
char color[MAXN][MAXN][MAXN];
char rechar[MAXN][MAXN][MAXN];
SPos *q;
int q_pos,q_sz;
int enda,endb;
char *res;

inline int GetCol(char code,char *a,char *b)
  {
    *a = code / 10;
    *b = code % 10;
  }

inline int GetPos(short code,short *x,short *y,short *z)
  {
    *x = code / 1600;
    code %= 1600;
    *y = code / 40;
    *z = code % 40;
  }

int GetL()
  {
    char ch;
    scanf("%c",&ch);
    while (!((ch >= 'A' && ch <= 'J') || ch == 'O'))
      scanf("%c",&ch);

    return ch - 'A';
  }

void Init()
  {
    int x,y,z;
    
//    freopen("lab.in","rt",stdin);
    scanf("%d",&n);
    scanf("%d%d%d%d%d%d",&rx,&ry,&rz,&jx,&jy,&jz);
    rx--;ry--;rz--;ra--;rb--;
    jx--;jy--;jz--;
    ra = GetL();    
    rb = GetL();

    for (z = 0;z < n;z++)
      for (x = 0;x < n;x++)
        for (y = 0;y < n;y++)
          color[x][y][z] = GetL();
          
    for (z = 0;z < n;z++)
      for (x = 0;x < n;x++)
        for (y = 0;y < n;y++)
          rechar[x][y][z] = GetL();

    q = (SPos*)malloc(sizeof(SPos)*MAXN*MAXN*MAXN*MAXL*MAXL);
  }

void Solve()
  {
    SPos vr,tmp;
    short x,y,z;
    char a,b;
    // Run BFS
    visited[rx][ry][rz][ra][rb] = -1;
    vr.pos = CODEPOS(rx,ry,rz);
    vr.col = CODECOL(ra,rb);
    q[0] = vr;
    q_sz = 1;
    while (q_pos < q_sz)
      {
        vr = q[q_pos++];
        GetPos(vr.pos,&x,&y,&z);
        GetCol(vr.col,&a,&b);

/*        if (!visited[x][y][z][a][b])
          printf("");

        if (x == 0 && y == 0 && z == 2)
          printf("");*/

        // Check for end
        if (x == jx && y == jy && z == jz)
          {
            enda = a;
            endb = b;
            return;
          }

        // X change
        if (x + 1 < n && (color[x + 1][y][z] == a || color[x + 1][y][z] == b) && !visited[x + 1][y][z][a][b])
          {
            visited[x + 1][y][z][a][b] = 'X';
            tmp.pos = CODEPOS(x + 1,y,z);
            tmp.col = CODECOL(a,b);
            q[q_sz++] = tmp;
          }
        if (x - 1 >= 0 && (color[x - 1][y][z] == a || color[x - 1][y][z] == b) && !visited[x - 1][y][z][a][b])
          {
            visited[x - 1][y][z][a][b] = 'U';
            tmp.pos = CODEPOS(x - 1,y,z);
            tmp.col = CODECOL(a,b);
            q[q_sz++] = tmp;
          }

        // Y change
        if (y + 1 < n && (color[x][y + 1][z] == a || color[x][y + 1][z] == b) && !visited[x][y + 1][z][a][b])
          {
            visited[x][y + 1][z][a][b] = 'Y';
            tmp.pos = CODEPOS(x,y + 1,z);
            tmp.col = CODECOL(a,b);
            q[q_sz++] = tmp;
          }
        if (y - 1 >= 0 && (color[x][y - 1][z] == a || color[x][y - 1][z] == b) && !visited[x][y - 1][z][a][b])
          {
            visited[x][y - 1][z][a][b] = 'V';
            tmp.pos = CODEPOS(x,y - 1,z);
            tmp.col = CODECOL(a,b);
            q[q_sz++] = tmp;
          }
          
        // Z change
        if (z + 1 < n && (color[x][y][z + 1] == a || color[x][y][z + 1] == b) && !visited[x][y][z + 1][a][b])
          {
            visited[x][y][z + 1][a][b] = 'Z';
            tmp.pos = CODEPOS(x,y,z + 1);
            tmp.col = CODECOL(a,b);
            q[q_sz++] = tmp;
          }
        if (z - 1 >= 0 && (color[x][y][z - 1] == a || color[x][y][z - 1] == b) && !visited[x][y][z - 1][a][b])
          {
            visited[x][y][z - 1][a][b] = 'W';
            tmp.pos = CODEPOS(x,y,z - 1);
            tmp.col = CODECOL(a,b);
            q[q_sz++] = tmp;
          }

        // Recharge
        if (rechar[x][y][z] + 'A' == 'O') continue;
        
        if (rechar[x][y][z] != a && rechar[x][y][z] != b && !visited[x][y][z][a][rechar[x][y][z]])
          {
            visited[x][y][z][a][rechar[x][y][z]] = b + 'A';
            tmp.pos = vr.pos;
            tmp.col = CODECOL(a,rechar[x][y][z]);
            q[q_sz++] = tmp;
          }
        if (rechar[x][y][z] != a && rechar[x][y][z] != b && !visited[x][y][z][rechar[x][y][z]][b])
          {
            visited[x][y][z][rechar[x][y][z]][b] = a + 'A';
            tmp.pos = vr.pos;
            tmp.col = CODECOL(rechar[x][y][z],b);
            q[q_sz++] = tmp;
          }
      }
  }

void MakeMove(short *x,short *y,short *z,char *a,char *b,char move)
  {
    switch (move)
      {
        case 'X' : (*x)--;break;
        case 'Y' : (*y)--;break;
        case 'Z' : (*z)--;break;
        case 'U' : (*x)++;break;
        case 'V' : (*y)++;break;
        case 'W' : (*z)++;break;
        default:
          if (rechar[*x][*y][*z] == *a) (*a) = move - 'A';
          else (*b) = move - 'A';
      }
  }

void Output()
  {
    short x,y,z;
    char a,b;
    int length = 0;
    int i;

    free(q);
    res = (char*)malloc(MAXN*MAXN*MAXN*MAXL*MAXL);
    
    x = jx;y = jy;z = jz;
    a = enda;b = endb;

    while (visited[x][y][z][a][b] != -1)
      {
        res[length] = visited[x][y][z][a][b];
        MakeMove(&x,&y,&z,&a,&b,visited[x][y][z][a][b]);
        length++;
      }
    printf("%d\n",length);
    for (i = length - 1;i >= 0;i--)
      printf("%c",res[i]);
    printf("\n");

    free(res);
  }

int main()
  {
    Init();
    Solve();
    Output();
    return 0;
  }
  
