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

#define         INF     (1<<16-1)

#define         MAXN    40
#define         MAXC    10

char lab[MAXN][MAXN][MAXN];
char writ[MAXN][MAXN][MAXN];
int N;

unsigned char par[MAXN*MAXN*MAXN*MAXC*MAXC];
char res[MAXN*MAXN*MAXN*MAXC];
unsigned short int dist[MAXN*MAXN*MAXN*MAXC*MAXC];
int beg, end, x1, y1, z1, x2, y2, z2;
char k0, k1;

int q[MAXN*MAXN*MAXN*MAXC];
int qh, qt;

void push(int x){
     q[qh++]=x;
     qh=(qh==MAXN*MAXN*MAXN*MAXC?0:qh);
}

int pop(){
     int res=q[qt++];
     qt=(qt==MAXN*MAXN*MAXN*MAXC?0:qt);
     return res;
}

struct sit{int x, y, z, card0, card1;};

int encode(const struct sit s){
    return s.x+MAXN*(s.y+MAXN*(s.z+MAXC*(s.card0+MAXC*s.card1)));
}

struct sit decode(int num){
       struct sit tmp;
       tmp.x=num%MAXN;num/=MAXN;
       tmp.y=num%MAXN;num/=MAXN;
       tmp.z=num%MAXC;num/=MAXC;
       tmp.card0=num%MAXC;num/=MAXC;
       tmp.card1=num%MAXC;
       return tmp;
}

int try_it(struct sit cs){
    if(cs.x>=0&&cs.y>=0&&cs.z>=0&&cs.x<MAXN&&cs.y<=MAXN&&cs.z<=MAXN&&
       (cs.card0==(lab[cs.x][cs.y][cs.z]-'A')||
        cs.card1==(lab[cs.x][cs.y][cs.z]-'A')))
        //*{printf("Return 1; -> ");printf("s:%d dist:%d\n", encode(cs), dist[encode(cs)]);
        return 1;
    //printf("Return 0;\n");
    return 0;
}

void bfs(int begn){
     struct sit cur, n;
     int cardto, curl, curs, i;
     push(begn);
     push(0);
     while(qh!=qt){
      /*printf("TRY! %d %d\n", qh, qt);*/
      curs=pop();
      curl=pop();
      dist[curs]=curl;
      n=cur=decode(curs);
//      for(i=0;i<100000;i++) if(dist[i]!=-1) printf("i -> %d\n", i);
      cardto=writ[cur.x][cur.y][cur.z]-'A';
      //eto i variantite...
      n=cur;n.x--;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);par[encode(n)]=11;}
      n=cur;n.x++;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);par[encode(n)]=12;}
      n=cur;n.y--;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);par[encode(n)]=13;}
      n=cur;n.y++;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);par[encode(n)]=14;}
      n=cur;n.z--;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);par[encode(n)]=15;}
      n=cur;n.z++;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);par[encode(n)]=16;}
      if(cardto<10){
      n=cur;n.card0=cardto;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);
          par[encode(n)]=17+cur.card0+MAXC*cur.card1+MAXC*MAXC;}
      n=cur;n.card1=cardto;
      if(try_it(n)&&dist[encode(n)]==INF)
         {dist[encode(n)]=INF-1;push(encode(n));push(curl+1);
          par[encode(n)]=17+cur.card0+MAXC*cur.card1;}
      }
     }
}

void findpath(struct sit ls, int minlen){
     struct sit n=ls;
     int help;
     while(minlen!=0){
      if(par[encode(ls)]<=16){
       if(par[encode(ls)]==11) {
        ls.x++;
        res[--minlen]='U';
       }else
       if(par[encode(ls)]==12) {
        ls.x--;
        res[--minlen]='X';
       }else
       if(par[encode(ls)]==13) {
        ls.y++;
        res[--minlen]='V';
       }else
       if(par[encode(ls)]==14) {
        ls.y--;
        res[--minlen]='Y';
       }else
       if(par[encode(ls)]==15) {
        ls.z++;
        res[--minlen]='W';
       }else
       if(par[encode(ls)]==16) {
        ls.z--;
        res[--minlen]='Z';
       }
      }
      else{
       help=par[encode(ls)]-17;
       //printf("%c %c\n", help%MAXC+'A', (help/MAXC)%MAXC+'A');
       if(help>=MAXC*MAXC) {
        help-=MAXC*MAXC;
        res[--minlen]=help%MAXC+'A';
       }
       else res[--minlen]=(help/MAXC)%MAXC+'A';
       ls.card0=help%MAXC;help/=MAXC;
       ls.card1=help%MAXC;
      }
     }
}

int main(void){
    int x, y, z, i, j, k, begsit, minlen=INF;
    struct sit a, lastsit;
    scanf("%d", &N);
    scanf("%d %d %d %d %d %d\n", &x1, &y1, &z1, &x2, &y2, &z2);
    scanf("%c%c\n", &k0, &k1);
    //printf("%c%c\n", k0, k1);
    for(i=0;i<MAXN*MAXN*MAXN*MAXC*MAXC;i++) dist[i]=INF;
    for(z=0;z<N;z++) for(x=0;x<N;x++) {
       for(y=0;y<N-1;y++) scanf("%c", &lab[x][y][z]);
       scanf("%c\n", &lab[x][y][z]);
    }
    for(z=0;z<N;z++) for(x=0;x<N;x++) {
       for(y=0;y<N-1;y++) scanf("%c", &writ[x][y][z]);
       scanf("%c\n", &writ[x][y][z]);
    }
    //printf("%c%c%c\n", writ[2][0][2], writ[2][1][2], writ[2][2][2]);
    a.x=x1-1;a.y=y1-1;a.z=z1-1;a.card0=k0-'A';a.card1=k1-'A';
    //printf("%c %c\n", a.card0+'A', a.card1+'A');
    begsit=encode(a);
    bfs(begsit);
    a.x=x2-1;a.y=y2-1;a.z=z2-1;
    for(i=0;i<MAXC;i++) for(j=0;j<MAXC;j++){
       a.card0=i;
       a.card1=j;
       if(dist[encode(a)]!=INF&&dist[encode(a)]<minlen) {
          minlen=dist[encode(a)];
          lastsit=a;
       }
    }
    findpath(lastsit, minlen);
    printf("%d\n", minlen);
    for(i=0;i<minlen;i++) printf("%c", res[i]);
    printf("\n");
//    printf("%c %c\n", lastsit.card0+'A', lastsit.card1+'A');
    /*a.x=1;
    a.y=1;
    a.z=1;
    a.card0='C'-'A';
    a.card1='D'-'A';
    printf("%d\n", try_it(a));   */
    return 0;
}
