/*
TASK: WAPPO
LANG: C
*/
#include<stdio.h>
#define mx 7
#define rem 4
#define mpos 2000000
#define maxx 29999
#define in stdin;//fopen("c:\\a\\rob.in","r")
FILE*fn;
typedef struct{ int x1,y1,x2,y2,x3,y3,r1,r2;} pos;
pos decode(int a)
  {pos b;
  b.r2=a%rem;a/=rem;
  b.r1=a%rem;a/=rem;
  b.y3=a%mx;a/=mx;
  b.x3=a%mx;a/=mx;
  b.y2=a%mx;a/=mx;
  b.x2=a%mx;a/=mx;
  b.y1=a%mx;a/=mx;
  b.x1=a;
  return b;}
int encode(pos a)
  {int c1=0;
  c1=a.x1;
  c1=c1*mx+a.y1;
  c1=c1*mx+a.x2;
  c1=c1*mx+a.y2;
  c1=c1*mx+a.x3;
  c1=c1*mx+a.y3;
  c1=c1*rem+a.r1;
  c1=c1*rem+a.r2;
  return c1;}
///////////////////////////////////////////////////////
short d[mpos];
char p[mpos];
int pp[mpos];
int q[mpos],qin,qou;
int atq(int a){q[qin++]=a;return 0;}
int gfq(void){return q[qou++];}
///////////////////////////////////////////////////////
int c;
int trap[mx][mx];
int go[mx][mx][4];
int where[mx][mx][4][2];
int initial[mx][mx];

pos preprocess(void)
  {pos start;
  int q1,q2,m,c1,c2,c3,c4,q3;
  fn=in;
  fscanf(fn,"%d %d %d %d %d %d %d %d",&c,&start.x1,&start.y1,&start.x2,&start.y2,&start.x3,&start.y3,&m);
  start.x1--;start.y1--;start.x2--;start.y2--;start.x3--;start.y3--;
  start.r1=start.r2=0;
  for(q1=0;q1<m;q1++)
    {fscanf(fn,"%d %d",&c1,&c2);
    c1--;c2--;
    trap[c1][c2]=1;}
  for(q1=0;q1<c;q1++)for(q2=0;q2<c;q2++)fscanf(fn,"%d",&initial[q1][q2]);
  fclose(fn);
  for(q1=0;q1<c;q1++)for(q2=0;q2<c;q2++)
    {
    c1=initial[q1][q2];
    if((c1&(1<<0))==0)go[q1][q2][2]=1;
    if((c1&(1<<1))==0)go[q1][q2][3]=1;
    if((c1&(1<<2))==0)go[q1][q2][0]=1;
    if((c1&(1<<3))==0)go[q1][q2][1]=1;
    }
  for(q1=0;q1<c;q1++)for(q2=0;q2<c;q2++)
    {
    for(q3=0;q3<4;q3++)
      {where[q1][q2][q3][0]=q1;
      where[q1][q2][q3][1]=q2;}

    if(go[q1][q2][0])where[q1][q2][0][0]--;
    if(go[q1][q2][1])where[q1][q2][1][0]++;
    if(go[q1][q2][2])where[q1][q2][2][1]--;
    if(go[q1][q2][3])where[q1][q2][3][1]++;
    }
  for(q1=0;q1<mpos;q1++)d[q1]=maxx;
  return start;}
///////////////////////////////////////////////////////
int movemon2(pos a,int h,pos*b)
  {int v=1;
  pos aa=a;

  if(aa.r1==0&&h)
    {
    if(aa.y2>aa.y1)
      {
      if(go[aa.x2][aa.y2][2])
	{a.x2=where[a.x2][a.y2][2][0];
	a.y2=where[a.x2][a.y2][2][1];
        v*=3;}
      else v*=2;
      }
    else if(aa.y2<aa.y1)
      {
      if(go[aa.x2][aa.y2][3])
	{a.x2=where[a.x2][a.y2][3][0];
	a.y2=where[a.x2][a.y2][3][1];
        v*=3;}
      else v*=2;
      }
    else v*=2;
    }
  if(((v%2==0)||h==0)&&a.r1==0)
    {
    if(aa.x2>aa.x1)
      if(go[aa.x2][aa.y2][0])
	{a.x2=where[a.x2][a.y2][0][0];
	a.y2=where[a.x2][a.y2][0][1];
        v*=3;}

    else if(aa.x2<aa.x1)
      if(go[aa.x2][aa.y2][1])
	{a.x2=where[a.x2][a.y2][1][0];
	a.y2=where[a.x2][a.y2][1][1];
        v*=3;}
    }
  *b=a;
  return v;}
int movemon3(pos a,int h,pos*b)
  {int v=1;
  pos aa=a;

  if(aa.r2==0&&h)
    {
    if(aa.y3>aa.y1)
      {
      if(go[aa.x3][aa.y3][2])
	{a.x3=where[a.x3][a.y3][2][0];
	a.y3=where[a.x3][a.y3][2][1];
	v*=3;}
      else v*=2;
      }
    else if(aa.y3<aa.y1)
      {
      if(go[aa.x3][aa.y3][3])
	{a.x3=where[a.x3][a.y3][3][0];
	a.y3=where[a.x3][a.y3][3][1];
	v*=3;}
      else v*=2;
      }
    else v*=2;
    }
  if(((v%2==0)||h==0)&&a.r2==0)
    {
    if(aa.x3>aa.x1)
      {if(go[aa.x3][aa.y3][0])
	{a.x3=where[a.x3][a.y3][0][0];
	a.y3=where[a.x3][a.y3][0][1];
        v*=3;}}

    else if(aa.x3<aa.x1)
      {if(go[aa.x3][aa.y3][1])
	{a.x3=where[a.x3][a.y3][1][0];
	a.y3=where[a.x3][a.y3][1][1];
        v*=3;}}
    }
  *b=a;
  return v;}
int lose(pos a)
  {if(a.x1==a.x2&&a.y1==a.y2)return 1;
  if(a.x1==a.x3&&a.y1==a.y3)return 1;
  return 0;}
int makemove(pos a,int b)
  {
  int c1,c2,c3,c4;
  pos e1=a,e2,e3;
  if(!go[a.x1][a.y1][b])return -1;
  e1.x1=where[a.x1][a.y1][b][0];
  e1.y1=where[a.x1][a.y1][b][1];
  if(e1.x1<0||e1.x1>=c||e1.y1<0||e1.y1>=c)return -2;
  if(trap[e1.x1][e1.y1])return -1;
  if(lose(e1))return -1;

  if(e1.x2!=mx-1)
    {c1=movemon2(e1,1,&e2);
    c2=movemon3(e2,1,&e3);
    if(e3.x2==e3.x3&&e3.y2==e3.y3)
      {e3.r1=e3.r2=0;
      e3.x2=e3.y2=mx-1;
      return encode(e3);}
    if(e3.r1==0&&c1%3==0&&trap[e3.x2][e3.y2])e3.r1=4;
    if(e3.r2==0&&c2%3==0&&trap[e3.x3][e3.y3])e3.r2=4;
    if(lose(e3))return -1;

    c1=movemon2(e3,c1%2,&e2);
    c2=movemon3(e2,c2%2,&e3);
    if(e3.x2==e3.x3&&e3.y2==e3.y3)
      {e3.r1=e3.r2=0;
      e3.x2=e3.y2=mx-1;
      return encode(e3);}
    if(e3.r1==0&&c1%3==0&&trap[e3.x2][e3.y2])e3.r1=4;
    if(e3.r2==0&&c2%3==0&&trap[e3.x3][e3.y3])e3.r2=4;
    if(lose(e3))return -1;

    if(e3.r1)e3.r1--;
    if(e3.r2)e3.r2--;

    return encode(e3);
    }

  if(e1.x2==mx-1)
    {c1=movemon3(e1,1,&e2);
    if(lose(e2))return -1;

    c2=movemon3(e2,c1%2,&e3);
    if(lose(e3))return -1;

    if(c1%2==0||c2%2==0)c1=0;else c1=1;

    movemon3(e3,c1,&e2);
    if(lose(e2))return -1;

    return encode(e2);
    }

  return -3;}
////////////////////////////////////////////////////
pos start,e1,e2,e3;
int c1,c2,c3,c4,q1;
int sol[mpos],sc;
int main()
  {
  start=preprocess();
  c1=encode(start);
  d[c1]=0;
  atq(c1);

  while(qin!=qou)
    {
    c1=gfq();
    e1=decode(c1);

    for(q1=0;q1<4;q1++)
      {
      c2=makemove(e1,q1);
      if(c2==-2)goto solution;
      //if(c2==-3)printf("ERROR\n");
      if(c2==-1||c2==-3)continue;

      if(d[c2]!=maxx)continue;
      d[c2]=d[c1]+1;
      p[c2]=q1;
      pp[c2]=c1;
      atq(c2);
      }

    }
 // printf("NO SOLUTION\n");
  solution:
  sol[sc++]=q1;
  while(c1!=encode(start))
    {sol[sc++]=p[c1];
    c1=pp[c1];}
  printf("%d\n",sc);
  for(q1=sc-1;q1>=0;q1--)printf("%d\n",sol[q1]);
  return 0;}

