/*
TASK:hop
LANG:C++
*/
#include<stdio.h>
#include<string.h>
#include<utility>
#include<math.h>
//#include<time.h>

#define MIN(a, b) (((a)<(b))?(a):(b))

#define valid1(p) ((p).x >= 0 && (p).y >= 0 && (p).x <= N && (p).y <= M)
#define valid2(p) (used[ind][(p).x][(p).y] == -1)
#define pii pair <int, int>
#define x first
#define y second
#define maxn 1510

using namespace std;
void input();
void solve();
void bfs(int ind);


int N, M;
int sq[maxn];
pii p[2];
int used[2][maxn][maxn];

int d[2];
int a1, a2;
int top[2];
pii queue[maxn*maxn];
pii E[2][maxn];

int main()
{
//clock();
input();
solve();
//printf("TIME IS %lf\n", clock()/(double)CLOCKS_PER_SEC);
return 0;
}

void solve()
{
int i, j;
int d0, d1;


for(i = 0; i < 1500; i++) sq[i] = i*i;

d0 = d[0]*d[0];
for(i = 0; sq[i] <= d0; i++)
      {
      j = (int) (sqrt(d0-sq[i]));
      if(sq[i] + sq[j] == d0) E[0][top[0]++] = make_pair(i, j);
//      for(j = 0; sq[j] + sq[i] <= d0; j++)
      }

d1 = d[1]*d[1];
for(i = 0; sq[i] <= d1; i++)
      {
      j = (int) (sqrt(d1 - sq[i]));
      if(sq[i] + sq[j] == d1) E[1][top[1]++] = make_pair(i, j);
//      for(j = 0; sq[j] + sq[i] <= d1; j++)
      }
      
memset(used, -1, sizeof(used));
bfs(0);
//printf("---\n");
bfs(1);

//freopen("hop.out", "w", stdout);

int c, best;
best = 1000000000;
for(i = 0; i <= N; i++)
      for(j = 0; j <= M; j++)
            if(used[0][i][j] != -1 && used[1][i][j] != -1)
                             {
                             c = used[0][i][j] + used[1][i][j];
//                             printf("they can both reach %d %d in %d moves\n", i, j, c);
                             best = MIN(best, c);
                             }
if(best == 1000000000) printf("0\n");
else printf("%d\n", best);
}


void bfs(int ind)
{
pii g, f;
int i, u;
queue[0] = p[ind];
a1 = 0; a2 = 1;


used[ind][p[ind].x][p[ind].y] = 0;
while(a1 < a2)
         {
         g = queue[a1++];
         for(i = 0; i < top[ind]; i++)
               {
               f.x = g.x + E[ind][i].x; f.y = g.y + E[ind][i].y;
               u = used[ind][g.x][g.y];
               if(valid1(f))
               if(valid2(f))
                           {
//                          printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + u;
                           queue[a2++] = f;
                           }
               f.x = g.x - E[ind][i].x; f.y = g.y - E[ind][i].y;
               if(valid1(f))
               if(valid2(f))               
                           {
//                           printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + u;
                           queue[a2++] = f;
                           }
               f.x = g.x + E[ind][i].x; f.y = g.y - E[ind][i].y;
               if(valid1(f))
               if(valid2(f))               
                           {
//                           printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + u;
                           queue[a2++] = f;
                           }

               f.x = g.x - E[ind][i].x; f.y = g.y + E[ind][i].y;
               if(valid1(f))
               if(valid2(f))               
                           {
//                           printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + u;
                           queue[a2++] = f;
                           }
               }
         }
         
         
}


void input()
{
//freopen("hop.in", "r", stdin);
scanf("%d%d", &N, &M);
scanf("%d%d%d", &p[0].x, &p[0].y, &d[0]);
scanf("%d%d%d", &p[1].x, &p[1].y, &d[1]);
}



