/*
TASK: hop
LANG: C
*/

#include <stdio.h>

#define MAX 1505
#define INF 123456789

#define STATE(a, b) ((a) * MAX + (b))

#define MAXF(a, b) (((a) > (b)) ? (a) : (b))

void input(void);
void solve(void);

void BFS(int x, int y, int s, int flag);

int n, m;
int x_1, y_1, s_1;
int x_2, y_2, s_2;
int A[2][MAX][MAX];
int Q[MAX * MAX], qf, qb;

int cnt;
int dx[10 * MAX];
int dy[10 * MAX];

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

void input(void)
{
     scanf("%d %d", &n, &m);
     
     scanf("%d %d %d", &x_1, &y_1, &s_1);
     
     scanf("%d %d %d", &x_2, &y_2, &s_2);
}

void solve(void)
{
    int best, z;
    int i, j;
  
    BFS(x_1, y_1, s_1, 0);
    BFS(x_2, y_2, s_2, 1);
    
    best = INF;
    for(i = 0; i <= n; i++)
      for(j = 0; j <= m; j++) {
        z = A[0][i][j] + A[1][i][j];
        best = best > z ? z : best;
      }
      
    printf("%d\n", (best == INF) ? 0 : best);
}

void BFS(int x, int y, int s, int flag)
{
    int a, b;
    int i, j;
    
    if(s > 2 * MAXF(n, m)) s = 2 * MAXF(n, m) + 1;
    
    cnt = 0;
    for(i = 0; i <= s; i++)
      for(j = 0; j <= s; j++) 
        if(i * i + j * j == s * s) {
          dx[cnt] = i;
          dy[cnt] = j;
          cnt++;
          dx[cnt] = -i;
          dy[cnt] = j;
          cnt++;
          dx[cnt] = i;
          dy[cnt] = -j;
          cnt++;
          dx[cnt] = -i;
          dy[cnt] = -j;
          cnt++;
        }
    
    for(i = 0; i <= n; i++) 
      for(j = 0; j <= m; j++) A[flag][i][j] = INF;

    qf = 0; qb = 0; Q[qb++] = STATE(x, y); A[flag][x][y] = 0;
    
    while(qf < qb) {
      a = Q[qf] / MAX; b = Q[qf] % MAX; qf++;
      
      for(i = 0; i < cnt; i++) {
        x = a + dx[i];
        y = b + dy[i];
        if(x < 0 || x > n || y < 0 || y > m) continue;
        if(A[flag][x][y] != INF) continue;
        A[flag][x][y] = A[flag][a][b] + 1;
        Q[qb++] = STATE(x, y);
      }
    }
}
        
