#include <cstdio>
#define MAX 10100
int qx[MAX];
int qy[MAX];
int qb,qe;
int n;
int visited[110][110];
int mx,my,gx,gy,lx,ly,resx,resy;
bool jumpUUR(int xx,int yy){
int x = xx+1;
int y = yy+2;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x <= mx ) && (y <= my)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool jumpURR(int xx,int yy){
int x = xx+2;
int y = yy+1;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x <= mx ) && (y <= my)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool jumpUUL(int xx,int yy){
int x = xx-1;
int y = yy+2;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x > 0 ) && (y <= my)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool jumpULL(int xx,int yy){
int x = xx-2;
int y = yy+1;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x > 0 ) && (y <= my)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool jumpDLL(int xx,int yy){
int x = xx-2;
int y = yy-1;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x > 0 ) && (y > 0)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool jumpDDL(int xx,int yy){
int x = xx-1;
int y = yy-2;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x > 0 ) && (y > 0)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool jumpDDR(int xx,int yy){
int x = xx+1;
int y = yy-2;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x <= mx ) && (y > 0)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool jumpDRR(int xx,int yy){
int x = xx+2;
int y = yy-1;
if((x == lx) && (y == ly)){
visited[x][y] = visited[xx][yy]+1 ;
resx = x;
resy = y;
return true;
}
if((x <= 100 ) || (y > 0)){
if(visited[x][y] == -1){
visited[x][y] = visited[xx][yy]+1 ;
qx[qe]=x;
qy[qe++]=y;
}
}
return false;
}
bool enqueue(){
int x,y;
x = qx[qb];
y = qy[qb++];
if(jumpUUR(x,y))
return true;
if(jumpURR(x,y))
return true;
if(jumpDRR(x,y))
return true;
if(jumpDDR(x,y))
return true;
if(jumpDDL(x,y))
return true;
if(jumpDLL(x,y))
return true;
if(jumpULL(x,y))
return true;
if(jumpUUL(x,y))
return true;
return false;
}
int main(int argc, char ** argv)
{
while(scanf("%d %d %d %d %d %d",&mx,&my,&gx,&gy,&lx,&ly) == 6){
qb = qe = 0;
qx[qe] = gx;
qy[qe++] = gy;
n = 0;
for(int i=1;i<=100;i++)
for(int ii=1;ii<=100;ii++)
visited[i][ii]= -1;
visited[gx][gy]=n;
while(1){
if(qb == qe){
printf("impossible\n");
break;
}
if(enqueue() == true){
printf("%d\n",visited[resx][resy]);
break;
}
}
}
return 0;
}