#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <deque>
#include <string>
using namespace std;
typedef struct
{
int x;
int y;
} bod;
int pole[100][100];
bool jevectverci(int x, int y, int r, int c)
{
return ((x >= 0 && x < r) && (y >= 0 && y< c))?true:false;
}
int main()
{
int r, c, gr, gc, lr, lc;
while(scanf("%d %d %d %d %d %d", &r, &c, &gr, &gc, &lr, &lc) == 6)
{
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
{
pole[i][j] = 0;
}
pole[lr-1][lc-1] = -1;
deque<bod> prosle;
bod b;
b.x = gr-1;
b.y = gc-1;
prosle.push_front(b);
deque<bod> nove;
int vysledek = 0;
int pocet = 1;
int max = 0;
pole[(prosle.back()).x][(prosle.back()).y] = pocet;
bool nenalezeno = true;
while(nenalezeno && max < 100)
{
max++;
if (!nove.empty())
prosle = nove;
nove.clear();
pocet++;
while(prosle.size() > 0)
{
if (jevectverci((prosle.back()).x+2,(prosle.back()).y+1,r,c))
{
if (pole[(prosle.back()).x+2][(prosle.back()).y+1] == 0)
{
pole[(prosle.back()).x+2][(prosle.back()).y+1] = pocet;
b.x = (prosle.back()).x+2;
b.y = (prosle.back()).y+1;
nove.push_front(b);
}
else if (pole[(prosle.back()).x+2][(prosle.back()).y+1] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
if (jevectverci((prosle.back()).x+2,(prosle.back()).y-1,r,c))
{
if (pole[(prosle.back()).x+2][(prosle.back()).y-1] == 0)
{
pole[(prosle.back()).x+2][(prosle.back()).y-1] = pocet;
b.x = (prosle.back()).x+2;
b.y = (prosle.back()).y-1;
nove.push_front(b);
}
else if (pole[(prosle.back()).x+2][(prosle.back()).y-1] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
if (jevectverci((prosle.back()).x-2,(prosle.back()).y+1,r,c))
{
if (pole[(prosle.back()).x-2][(prosle.back()).y+1] == 0)
{
pole[(prosle.back()).x-2][(prosle.back()).y+1] = pocet;
b.x = (prosle.back()).x-2;
b.y = (prosle.back()).y+1;
nove.push_front(b);
}
else if (pole[(prosle.back()).x-2][(prosle.back()).y+1] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
if (jevectverci((prosle.back()).x-2,(prosle.back()).y-1,r,c))
{
if (pole[(prosle.back()).x-2][(prosle.back()).y-1] == 0)
{
pole[(prosle.back()).x-2][(prosle.back()).y-1] = pocet;
b.x = (prosle.back()).x-2;
b.y = (prosle.back()).y-1;
nove.push_front(b);
}
else if (pole[(prosle.back()).x-2][(prosle.back()).y-1] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
if (jevectverci((prosle.back()).x+1,(prosle.back()).y+2,r,c))
{
if (pole[(prosle.back()).x+1][(prosle.back()).y+2] == 0)
{
pole[(prosle.back()).x+1][(prosle.back()).y+2] = pocet;
b.x = (prosle.back()).x+1;
b.y = (prosle.back()).y+2;
nove.push_front(b);
}
else if (pole[(prosle.back()).x+1][(prosle.back()).y+2] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
if (jevectverci((prosle.back()).x+1,(prosle.back()).y-2,r,c))
{
if (pole[(prosle.back()).x+1][(prosle.back()).y-2] == 0)
{
pole[(prosle.back()).x+1][(prosle.back()).y-2] = pocet;
b.x = (prosle.back()).x+1;
b.y = (prosle.back()).y-2;
nove.push_front(b);
}
else if (pole[(prosle.back()).x+1][(prosle.back()).y-2] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
if (jevectverci((prosle.back()).x-1,(prosle.back()).y+2,r,c))
{
if (pole[(prosle.back()).x-1][(prosle.back()).y+2] == 0)
{
pole[(prosle.back()).x-1][(prosle.back()).y+2] = pocet;
b.x = (prosle.back()).x-1;
b.y = (prosle.back()).y+2;
nove.push_front(b);
}
else if (pole[(prosle.back()).x-1][(prosle.back()).y+2] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
if (jevectverci((prosle.back()).x-1,(prosle.back()).y-2,r,c))
{
if (pole[(prosle.back()).x-1][(prosle.back()).y-2] == 0)
{
pole[(prosle.back()).x-1][(prosle.back()).y-2] = pocet;
b.x = (prosle.back()).x-1;
b.y = (prosle.back()).y-2;
nove.push_front(b);
}
else if (pole[(prosle.back()).x-1][(prosle.back()).y-2] == -1)
{
vysledek = pocet;
nenalezeno = false;
break;
}
}
prosle.pop_back();
}
}
/*
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
printf("%d ",pole[i][j]);
}
printf("\n");
}
int max = -1;
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
{
if(pole[i][j] > max)
max = pole[i][j];
}*/
if (vysledek == 0)
printf("impossible\n");
else
printf("%d\n",vysledek-1);
}
return 0;
}