/*
TASK: lab
LANG: C
*/
#include<stdio.h>
//#include<conio.h>
#define mx 43
#define mc 10
#define size 7000000
#define qsize 1000000
#define in stdin;//fopen("c:\\a\\lab.in","r");
FILE*fn;
typedef struct{int x,y,z,k1,k2;}pos;
int code(pos a)
  {int c1=0;
  c1=((a.x*mx+a.y)*mx+a.z)*mx;
  c1=(c1+a.k1)*mc+a.k2;
  return c1;}
pos decode(int c1)
  {pos a;
  a.k2=c1%mc;
  c1/=mc;
  a.k1=c1%mx;
  c1/=mx;
  a.z=c1%mx;
  c1/=mx;
  a.y=c1%mx;
  c1/=mx;
  a.x=c1;
  return a;}
int lab[mx][mx][mx];
int key[mx][mx][mx];
int c,xr,yr,zr,xj,yj,zj,sk1,sk2;
int q1,q2,q3;
int c1,c2,c3;
int gech(void)
  {char a=0;
  fscanf(fn,"%c",&a);
  while(a<'A'||a>'Z')
    fscanf(fn,"%c",&a);
  return a-'A';}
char p[size];
char p1[size];
int start,end;
int abss(int a){return a<0?-a:a;}
int ift(int a)
  {if(abss(a-end)<mc*mc)return 1;
  return 0;}
pos e,f,e1,e2;
int n,m,x,z,y;
char ans[size];


//////////
int q[qsize],qin,qou;
int atq(int a)
  {//printf("from : %d %d %d %d %d   to: %d %d %d %d %d\n",x,y,z,n,m,e2.x,e2.y,e2.z,e2.k1,e2.k2);
///  getche();
  q[qin]=a;qin=(qin+1)%qsize;return 0;}
int gfq(void){int c1=q[qou];qou=(qou+1)%qsize;return c1;}
////////
int main()
  {fn=in;
  fscanf(fn,"%d %d %d %d %d %d %d",&c,&xr,&yr,&zr,&xj,&yj,&zj);
  sk1=gech();
  sk2=gech();
  for(q1=0;q1<c+2;q1++)for(q2=0;q2<c+2;q2++)for(q3=0;q3<c+2;q3++)lab[q1][q2][q3]=25;
  for(q1=1;q1<=c;q1++)for(q2=1;q2<=c;q2++)for(q3=1;q3<=c;q3++)
    lab[q2][q3][q1]=gech();
  for(q1=1;q1<=c;q1++)for(q2=1;q2<=c;q2++)for(q3=1;q3<=c;q3++)
    key[q2][q3][q1]=gech();
  fclose(fn);

//  for(q1=1;q1<=c;q1++)
//    {for(q2=1;q2<=c;q2++)
  //    {for(q3=1;q3<=c;q3++)printf("%d",lab[q2][q3][q1]);
//      printf("\n");}
  //  printf("\n");}

  e.x=xr;e.y=yr;e.z=zr;e.k1=sk1;e.k2=sk2;
  f.x=xj;f.y=yj;f.z=zj;f.k1=f.k2=mc/2;

  start=code(e);
  end=code(f);
  for(q1=0;q1<size;q1++)p[q1]=p1[q1]='-';
  p[start]='+';
  atq(start);
  while(qin!=qou)
    {c1=gfq();

    if(ift(c1))
      break;
    e=decode(c1);
    x=e.x;
    y=e.y;
    z=e.z;
    n=e.k1;
    m=e.k2;
    e1=e;

    e2=e1;

    if(lab[x-1][y][z]==n||lab[x-1][y][z]==m)
      {e2.x--;
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='1';
	atq(c2);}
      e2.x++;}

    if(lab[x+1][y][z]==n||lab[x+1][y][z]==m)
      {e2.x++;
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='2';
	atq(c2);}
      e2.x--;}

    if(lab[x][y-1][z]==n||lab[x][y-1][z]==m)
      {e2.y--;
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='3';
	atq(c2);}
      e2.y++;}

    if(lab[x][y+1][z]==n||lab[x][y+1][z]==m)
      {e2.y++;
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='4';
	atq(c2);}
      e2.y--;}

    if(lab[x][y][z-1]==n||lab[x][y][z-1]==m)
      {e2.z--;
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='5';
	atq(c2);}
      e2.z++;}

    if(lab[x][y][z+1]==n||lab[x][y][z+1]==m)
      {e2.z++;
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='6';
	atq(c2);}
      e2.z--;}

    if(key[x][y][z]!='O'-'A')
      {e2.k1=key[x][y][z];
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='A';
	p1[c2]=e1.k1+'A';
	atq(c2);}
      e2.k1=e1.k1;

      e2.k2=key[x][y][z];
      c2=code(e2);
      if(p[c2]=='-')
	{p[c2]='B';
	p1[c2]=e1.k2+'A';
	atq(c2);}
      e2.k2=e1.k2;}}
  q1=0;

  e=decode(c1);
  while(c1!=start)
    {ans[q1++]=p[c1];
    if(p[c1]=='1')e.x++;
    if(p[c1]=='2')e.x--;
    if(p[c1]=='3')e.y++;
    if(p[c1]=='4')e.y--;
    if(p[c1]=='5')e.z++;
    if(p[c1]=='6')e.z--;
    if(p[c1]=='A')e.k1=p1[c1]-'A';
    if(p[c1]=='B')e.k2=p1[c1]-'A';
    c2=code(e);
    c1=c2;}
  e=decode(start);

  printf("%d\n",q1);
  for(q2=q1-1;q2>=0;q2--)
    {if(ans[q2]=='1'){printf("U");e.x--;}
    if(ans[q2]=='2'){printf("X");e.x++;}
    if(ans[q2]=='3'){printf("V");e.y--;}
    if(ans[q2]=='4'){printf("Y");e.y++;}
    if(ans[q2]=='5'){printf("W");e.z--;}
    if(ans[q2]=='6'){printf("Z");e.z++;}
    if(ans[q2]=='A'){printf("%c",e.k1+'A');e.k1=key[e.x][e.y][e.z];}
    if(ans[q2]=='B'){printf("%c",e.k2+'A');e.k2=key[e.x][e.y][e.z];}}


  printf("\n");




  return 0;}
