//
// File: mosquito.cc
// Author: cteam035
//
// Created on October 27, 2012, 11:23 AM
//
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <iostream>
#include <stdio.h>
#include <climits>
using namespace std;
//
//
//
int ** pole;
int R, C;
int xF, yF;
int vysledek2;
void vypisPole() {
for (int i=0 ; i<R ; i++) {
for (int j=0 ; j<C ; j++) {
printf("%15d",pole[i][j]);
}
cout << endl;
}
}
int rekurze(int jump, int X, int Y) {
if ( pole[X][Y] < jump) {
return pole[X][Y];
}
if ( X == xF && Y == yF ) { //finish
pole[X][Y] = jump;
if ( jump < vysledek2 ) {
vysledek2 = jump;
}
return jump;
}
pole[X][Y] = jump;
int ret = INT_MAX;
int tmpRet = INT_MAX;
if ( X+2 < C && Y+1 < R) {
tmpRet = rekurze(jump+1, X+2, Y+1);
if (tmpRet < ret) {
ret = tmpRet;
}
}
if ( X+1 < C && Y+2 < R) {
tmpRet = rekurze(jump+1, X+1, Y+2);
if (tmpRet < ret) {
ret = tmpRet;
}
}
if ( X+2 < C && Y-1 >= 0) {
tmpRet = rekurze(jump+1, X+2, Y-1);
if (tmpRet < ret) {
ret = tmpRet;
}
}
if ( X+1 < C && Y-2 >= 0) {
tmpRet = rekurze(jump+1, X+1, Y-2);
if (tmpRet < ret) {
ret = tmpRet;
}
}
if ( X-2 >= 0 && Y+1 < R) {
tmpRet = rekurze(jump+1, X-2, Y+1);
if (tmpRet < ret) {
ret = tmpRet;
}
}
if ( X-1 >= 0 && Y+2 < R) {
tmpRet = rekurze(jump+1, X-1, Y+2);
if (tmpRet < ret) {
ret = tmpRet;
}
}
if ( X-1 >= 0 && Y-2 >= 0 ) {
tmpRet = rekurze(jump+1, X-1, Y-2);
if (tmpRet < ret) {
ret = tmpRet;
}
}
if ( X-2 >= 0 && Y-1 >= 0 ) {
tmpRet = rekurze(jump+1, X-2, Y-1);
if (tmpRet < ret) {
ret = tmpRet;
}
}
return ret;
}
int main(int argc, char** argv) {
int X1, X2, Y1, Y2;
int vysledek;
while ( cin >> R >> C >> X1 >> Y1 >> X2 >> Y2 ) {
X1 -= 1;
X2 -= 1;
Y1 -= 1;
Y2 -= 1;
vysledek2 = INT_MAX;
pole = new int* [R];
for( int i=0 ; i<R ; i++) {
pole[i] = new int[C];
for (int j=0 ; j<C ; j++) {
pole[i][j]=INT_MAX;
}
}
xF = X2;
yF = Y2;
vysledek = rekurze(0, X1, Y1);
if (vysledek == INT_MAX) {
cout << "impossible" << endl;
}
else {
cout << vysledek2 << endl;
}
//vypisPole();
}
return (EXIT_SUCCESS);
}