/*
TASK:wappo
LANG:C++
*/
#include <cstdio>
#include <queue>
#include <cstdlib>
using namespace std;

#define M (1<<21)
#define N 6
#define T (N*N)

struct Coord
{
    int r,c;
};

bool operator==(Coord &c1, Coord &c2)
{
    return c1.r==c2.r && c1.c==c2.c;
}

int n,t;
Coord p[4];
Coord tr[T];
int bad[6][6];
int mod;
int tbl[6][6];
char trn[M];
int bak[M];

#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3

int brd[4] = {4,8,1,2};

void readf()
{
    int i,j;
    scanf("%d",&n);
    mod=36;
    for(i=0; i<3; i++)
    {
	scanf("%d %d",&p[i].r,&p[i].c);
	p[i].r--;
	p[i].c--;
    }
    scanf("%d",&t);
    for(i=0; i<t; i++)
    {
	scanf("%d %d",&tr[i].r,&tr[i].c);
	tr[i].r--;
	tr[i].c--;
	bad[tr[i].r][tr[i].c]=1;
    }
    for(i=0; i<n; i++)
	for(j=0; j<n; j++)
	    scanf("%d",tbl[i]+j);
}

int encode(Coord *p)
{
    int i,cd=0;
    for(i=0; i<3; i++)
    {
	cd*=mod;
	cd+=p[i].r*6+p[i].c;
    }
    cd*=25;
    cd+=p[3].r*5+p[3].c;
    return cd;
}

void decode(int cd)
{
    int i,r;
    r=cd%25;
    cd=cd/25;
    p[3].c=r%5;
    p[3].r=r/5;
    for(i=2; i>=0; i--)
    {
	r=cd%mod;
	cd=cd/mod;
	p[i].c=r%6;
	p[i].r=r/6;
    }
}

Coord pb[4];
queue <int> q;

void copy(Coord *src, Coord *dest)
{
    int i;
    for(i=0; i<4; i++) dest[i]=src[i];
}

void End(int cd, int mv)
{
    int cr,i;
    vector <int> ans;
    cr=cd;
    ans.push_back(mv);
    while(bak[cd]-1>=0)
    {
	ans.push_back(trn[cd]);
	cd=bak[cd]-1;
    }
    printf("%d\n",ans.size());
    for(i=ans.size()-1; i>=0; i--)
	printf("%d\n",ans[i]);
    exit(0);
}

int mmon(int m)
{
    // Movement
    // left
    if(pb[m].c-pb[0].c>0 && !( tbl[pb[m].r][pb[m].c] & brd[LEFT] ) )
    {
	pb[m].c--;
	return 1;
    }
    // right
    if(pb[m].c-pb[0].c<0 && !( tbl[pb[m].r][pb[m].c] & brd[RIGHT] ) )
    {
	pb[m].c++;
	return 1;
    }
    // up
    if(pb[m].r-pb[0].r>0 && !( tbl[pb[m].r][pb[m].c] & brd[UP] ) )
    {
	pb[m].r--;
	return 1;
    }
    // down
    if(pb[m].r-pb[0].r<0 && !( tbl[pb[m].r][pb[m].c] & brd[DOWN] ) )
    {
	pb[m].r++;
	return 1;
    }
    return 0;
}

int monstar()
{
    int cd,trn[2];
    if(bad[pb[0].r][pb[0].c])return -1;
    if(pb[1]==pb[0] || pb[2]==pb[0]) return -1;
    if(pb[3].c==4)
    {
	trn[0]=3;
	trn[1]=0;
    }
    else
    {
	if(pb[3].r) trn[0]=0;
	else trn[0]=2;
	if(pb[3].c) trn[1]=0;
	else trn[1]=2;
    }
    if(pb[3].r && pb[3].r!=4) pb[3].r--;
    if(pb[3].c && pb[3].c!=4) pb[3].c--;
    while(trn[0]+trn[1])
    {
	if(trn[0])
	{
	    trn[0]--;
	    if(mmon(1))
	    {
		if(bad[pb[1].r][pb[1].c] && pb[3].r!=4)
		{
		    trn[0]=0;
		    pb[3].r=3;
		}
	    }
		if(pb[1]==pb[0]) return -1;
	}
	if(trn[1])
	{
	    trn[1]--;
	    if(mmon(2))
	    {
		if(bad[pb[2].r][pb[2].c] && pb[3].c!=4)
		{
		    trn[1]=0;
		    pb[3].c=3;
		}
	    }
		if(pb[3].c!=4 && pb[2]==pb[0]) return -1;
	}
	if(pb[3].c!=4 && pb[1]==pb[2])
	{
	    pb[3].r=4;
	    pb[3].c=4;
	    break;
	}
    }
    cd=encode(pb);
    return cd;
}

void makeMoves(int b)
{
    int cd;
    //End();
    if( !( tbl[p[0].r][p[0].c] & brd[UP] ) )
    {
	copy(p,pb);
	pb[0].r--;
	if(pb[0].r== -1) End(b,UP);
	cd=monstar();
	if(cd>=0 && !bak[cd])
	{
	    bak[cd]=b+1;
	    trn[cd]=UP;
	    q.push(cd);
	}
    }
    if( !( tbl[p[0].r][p[0].c] & brd[DOWN] ) )
    {
	copy(p,pb);
	pb[0].r++;
	if(pb[0].r== n) End(b,DOWN);
	cd=monstar();
	if(cd>=0 && !bak[cd])
	{
	    bak[cd]=b+1;
	    trn[cd]=DOWN;
	    q.push(cd);
	}
    }
    if( !( tbl[p[0].r][p[0].c] & brd[LEFT] ) )
    {
	copy(p,pb);
	pb[0].c--;
	if(pb[0].c== -1) End(b,LEFT);
	cd=monstar();
	if(cd>=0 && !bak[cd])
	{
	    bak[cd]=b+1;
	    trn[cd]=LEFT;
	    q.push(cd);
	}
    }
    if( !( tbl[p[0].r][p[0].c] & brd[RIGHT] ) )
    {
	copy(p,pb);
	pb[0].c++;
	if(pb[0].c== n) End(b,RIGHT);
	cd=monstar();
	if(cd>=0 && !bak[cd])
	{
	    bak[cd]=b+1;
	    trn[cd]=RIGHT;
	    q.push(cd);
	}
    }
}

void debug()
{
    int i,j;
    for(i=0; i<n; i++)
    {
	for(j=0; j<n; j++)
	{
	    if(p[0].r==i && p[0].c==j)
	    {
		printf("h ");
		continue;
	    }
	    if(p[1].r==i && p[1].c==j)
	    {
		printf("%d ",p[3].r);
		continue;
	    }
	    if(p[2].r==i && p[2].c==j)
	    {
		printf("%d ",p[3].c);
		continue;
	    }
	    printf("- ");
	}
	printf("\n");
    }
    printf("----\n");
}

void solve()
{
    int cd;
    cd=encode(p);
    q.push(cd);
    bak[cd]= -1;
    while(q.size())
    {
	cd=q.front();
	q.pop();
	decode(cd);
	//debug();
	makeMoves(cd);
    }
    printf("ERROR!\n");
}

int main()
{
    readf();
    /*int i,j,cd;
    cd=encode(p);
    for(i=0; i<n; i++)
    {
	for(j=0; j<n; j++) printf("%d ",tbl[i][j]);
	printf("\n");
    }
    decode(cd);
    for(i=0; i<4; i++)
	printf("%d %d\n",p[i].r,p[i].c);*/
    solve();
    return 0;
}

