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

#define MAXN  8
#define MAXL  4194304 //16777216
#define herox 19
#define heroy 16
#define mon1x 11
#define mon1y 8
#define mon1t 14
#define mon2x 3
#define mon2y 0
#define mon2t 6
#define koord 63
/*
#define mask     0x3FFFFF    
#define maskhero 0x3F0000
#define maskmon1 0x00FF00
#define maskmon1 0x3FFF00
*/
int visited[MAXL];
int queue[MAXL];
int father[MAXL];
int grand;
int mass[MAXN][MAXN];
int trap[MAXN][MAXN];
int N;
int x,y;
int m1x,m1y;
int m2x,m2y;
int m1t,m2t;
int start;

int calcnext()
{   int i;
    m1x=(queue[start]>>mon1x)&7;
    m1y=(queue[start]>>mon1y)&7;
    m2x=(queue[start]>>mon2x)&7;
    m2y=(queue[start]>>mon2y)&7;
    m1t=(queue[start]>>mon1t)&3;
    m2t=(queue[start]>>mon2t)&3;
        
    if ( (!trap[x][y]) && (((x<<3)+y)!=((m1x<<3)+m1y)) && (((x<<3)+y)!=((m2x<<3)+m2y)) ) 
    {
       //mbig
       if ( ((queue[start]>>mon1y)&63)==((queue[start]>>mon2y)&63) )
       {  for (i=0;i<3;i++)
          {   if ( (m1x==x) && (m1y==y) )
                 return 0;
          
              if (x<m1x)
                 if (!(mass[m1x-1][m1y]&1))
                    m1x--;
                 else goto mbigy;
              else if (x>m1x)
                   if (!(mass[m1x+1][m1y]&2))
                      m1x++;
                   else goto mbigy;
              else
                  mbigy:
                       if (y<m1y)
                          if (!(mass[m1x][m1y-1]&4))
                             m1y--;
                       else if (y>m1y)
                             if (!(mass[m1x][m1y+1]&8))
                             m1y++;
          }
          m2x=m1x;m2y=m1y;
       }
       //small
       else 
       {  if (m1t>0) m1t--;
          if (m2t>0) m2t--;
          for (i=0;i<2;i++)
          {   if ( (m1x==m2x) && (m1y==m2y) )
                 break;
              //m1t
              if (m1t==0)
              {   if ( (m1x==x) && (m1y==y) )
                     return 0;
                  else if ( trap[m1x][m1y] )
                       m1t=3;
                  else if (x<m1x)
                       if (!(mass[m1x-1][m1y]&1))
                          m1x--;
                       else goto ms1y;
                  else if (x>m1x)
                       if (!(mass[m1x+1][m1y]&2))
                          m1x++;
                       else goto ms1y;
                  else
                     ms1y:
                           if (y<m1y)
                              if (!(mass[m1x][m1y-1]&4))
                                 m1y--;
                           else if (y>m1y)
                                if (!(mass[m1x][m1y+1]&8))
                                   m1y++;
               }
               //m2t
              if (m2t==0)
              {   if ( (m2x==x) && (m2y==y) )
                     return 0;
                  else if ( trap[m2x][m2y] )
                       m2t=3;
                  else if (x<m2x)
                       if (!(mass[m2x-1][m2y]&1))
                          m2x--;
                       else goto ms2y;
                  else if (x>m2x)
                       if (!(mass[m2x+1][m2y]&2))
                          m2x++;
                       else goto ms2y;
                  else
                     ms2y:
                           if (y<m2y)
                              if (!(mass[m2x][m2y-1]&4))
                                 m2y--;
                           else if (y>m2y)
                                if (!(mass[m2x][m2y+1]&8))
                                   m2y++;
               }
          }
       }
         
          if ( (m1x==x) && (m1y==y) )
                     return 0;
                  else if ( trap[m1x][m1y] )
                       m1t=3;
           if ( (m2x==x) && (m2y==y) )
                     return 0;
                  else if ( trap[m2x][m2y] )
                       m2t=3;              
            
          return (x<<herox)+(y<<heroy)+
                 (m1x<<mon1x)+(m1y<<mon1y)+(m1t<<mon1t)+
                 (m2x<<mon2x)+(m2y<<mon2y)+(m2t<<mon2t);
    }

    return 0;
}

int main()
{   int temp,i,j,a,b,start,end;
    //freopen("wappo.txt","r",stdin);
    scanf("%d",&N);
    scanf("%d %d",&b,&a);
    grand+=/*(grand&maskhero)+*/(a<<herox)+(b<<heroy);
    scanf("%d %d",&b,&a);
    grand+=/*(grand&maskhero)+*/(a<<mon1x)+(b<<mon1y);
    scanf("%d %d",&b,&a);
    grand+=/*(grand&maskhero)+*/(a<<mon2x)+(b<<mon2y);
    scanf("%d",&temp);  
    for (i=0;i<temp;i++)
    {   scanf("%d %d",&b,&a);
        trap[a][b]=1;
    }
    for (i=1;i<=N;i++)
    {   for (j=1;j<=N;j++)
        {   scanf("%d",&mass[j][i]);
        }
    }
    queue[0]=grand;
    visited[grand]=1;
    visited[0]=1;
    end=1;
    
    for (start=0;start<end;start++)
    {   x=(queue[start]>>herox)&7;
        y=(queue[start]>>heroy)&7;
                
        //up
        y--;
        if (!(mass[x][y+1]&4)) 
           temp=calcnext(/*x,y,*/);
           if (visited[temp]==0)
           {  queue[end]=temp;
              father[temp]=queue[start];
              end++;
              visited[temp]=1;
              if ( (x<1) || (y<1) || (x>N) || (y>N) )
                 break;
           }
        y++;
        //down
        y++;
        if (!(mass[x][y-1]&8)) 
           temp=calcnext(/*x,y,*/);
           if (visited[temp]==0)
           {  queue[end]=temp;
              father[temp]=queue[start];
              end++;
              visited[temp]=1;
              if ( (x<1) || (y<1) || (x>N) || (y>N) )
                 break;
           }
        y--;   
        //left
        x--;
        if (!(mass[x+1][y]&1)) 
           temp=calcnext(/*x,y,*/);
           if (visited[temp]==0)
           {  queue[end]=temp;
              father[temp]=queue[start];
              end++;
              visited[temp]=1;
              if ( (x<1) || (y<1) || (x>N) || (y>N) )
                 break;
           }
        x++; 
        //right
        x++;
        if (!(mass[x-1][y]&2)) 
           temp=calcnext(/*x,y,*/);
           if (visited[temp]==0)
           {  queue[end]=temp;
              father[temp]=queue[start];
              end++;
              visited[temp]=1;
              if ( (x<1) || (y<1) || (x>N) || (y>N) )
                 break;
           }
        x--;    
    }
    
    for (j=0,i=temp;i!=grand;j++,i=father[i])
    {    x=i>>herox;
         y=i>>heroy;
         m1x=father[i]>>herox;
         m1y=father[i]>>heroy;
         if ( (m1x-x)==1 )
            queue[j]=3;
         if ( (m1x-x)==-1 )
            queue[j]=2;
         if ( (m1y-y)==1 )
            queue[j]=0;
         if ( (m1y-y)==-1 )
            queue[j]=1;
    }
    printf("%d\n",j);
    for (i=0;i<j;i++)
        printf("%d\n",queue[j-i-1]);
    
    return 0;   
}
