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

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

#define valid(p) ((p).x >= 0 && (p).y >= 0 && (p).x <= N && (p).y <= M && 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);

pii operator +(pii p1, pii p2) { return make_pair(p1.x + p2.x, p1.y + p2.y); }
pii operator -(pii p1, pii p2) { return make_pair(p1.x - p2.x, p1.y - p2.y); }
pii operator *(pii p1, pii p2) { return make_pair(p1.x + p2.x, p1.y - p2.y); }
pii operator /(pii p1, pii p2) { return make_pair(p1.x - p2.x, p1.y + p2.y); }

int N, M;

pii p[2];
char used[2][maxn][maxn];

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

int main()
{
input();
solve();
return 0;
}

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


d0 = d[0]*d[0];
for(i = 0; i*i <= d0; i++)
      for(j = 0; j*j + i*i <= d0; j++)
            if(i*i + j*j == d0) E[0][top[0]++] = make_pair(i, j);

d1 = d[1]*d[1];
for(i = 0; i*i <= d1; i++)
      for(j = 0; j*j + i*i <= d1; j++)
            if(i*i + j*j == d1) E[1][top[1]++] = make_pair(i, j);

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;
queue[0] = p[ind];
a1 = 0; a2 = 1;

memset(used[ind], -1, sizeof(used[ind]));
used[ind][p[ind].x][p[ind].y] = 0;
while(a1 < a2)
         {
         g = queue[a1++];
         for(i = 0; i < top[ind]; i++)
               {
               f = g + E[ind][i];
               if(valid(f))
                           {
//                          printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + used[ind][g.x][g.y];
                           queue[a2++] = f;
                           }
               f = g - E[ind][i];
               if(valid(f))
                           {
//                           printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + used[ind][g.x][g.y];
                           queue[a2++] = f;
                           }
               f = g * E[ind][i];
               if(valid(f))
                           {
//                           printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + used[ind][g.x][g.y];
                           queue[a2++] = f;
                           }
               f = g / E[ind][i];
               if(valid(f))
                           {
//                           printf("added %d %d to the queue\n", f.x, f.y);
                           used[ind][f.x][f.y] = 1 + used[ind][g.x][g.y];
                           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]);
}



