/*
TASK: hop
LANG: C++
*/
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int MAXN  = 1520;
const int INF   = 999999;

struct point {
    int x;
    int y;
    point(int t1=0, int t2=0) : x(t1), y(t2) {}
};

int c1, g1;
int n, m;
int A[2][MAXN][MAXN];
point c, g;
vector< point > C1;
vector< point > G1;
int ans = INF;

inline int mmax(int a, int b) {
    return a>b?a:b;
}

void bfs(point curr, queue<point> &q, int pp) {
    if( pp == 0 ) {
        for(int i = 0; i < C1.size(); ++i) {
            point zz = curr;
            zz.x += C1[i].x; zz.y += C1[i].y;
            if( zz.y >= 0 && zz.y <= m && zz.x >= 0 && zz.x <= n && A[0][zz.y][zz.x] > A[0][curr.y][curr.x] + 1 ) {
                A[0][zz.y][zz.x] = A[0][curr.y][curr.x] + 1;
                q.push( zz );
            }
        }
    } else {
        for(int i = 0; i < G1.size(); ++i) {
            point zz = curr;
            zz.x += G1[i].x; zz.y += G1[i].y;
            if( zz.y >= 0 && zz.y <= m && zz.x >= 0 && zz.x <= n && A[1][zz.y][zz.x] > A[1][curr.y][curr.x] + 1 ) {
                A[1][zz.y][zz.x] = A[1][curr.y][curr.x] + 1;
                if( A[1][zz.y][zz.x] != INF && A[0][zz.y][zz.x] != INF ) {
                    ans <?= mmax(A[1][zz.y][zz.x], A[0][zz.y][zz.x]);
                }
                q.push( zz );
            }
        }
    }
}

int main() {

    scanf("%d %d", &n, &m);
    scanf("%d %d %d", &c.x, &c.y, &c1);
    scanf("%d %d %d", &g.x, &g.y, &g1);

    for(int cc = 0; cc < 2; ++cc)
        for(int i = 0; i < MAXN; ++i)
            for(int j = 0; j < MAXN; ++j)
                A[cc][i][j] = INF;    

    C1.push_back( point(c1, 0) ); C1.push_back( point(-c1, 0) );
    C1.push_back( point(0, c1) ); C1.push_back( point(0, -c1) );
    for(int i = 1; i < c1; ++i)
        for(int j = 1; j < c1; ++j)
            if( i*i + j*j == c1*c1 && i+j>c1 ) {
                C1.push_back( point(i, j) );
                C1.push_back( point(-i, j) );
                C1.push_back( point(i, -j) );
                C1.push_back( point(-i, -j) );
            }

    G1.push_back( point(g1, 0) ); G1.push_back( point(-g1, 0) );
    G1.push_back( point(0, g1) ); G1.push_back( point(0, -g1) );
    for(int i = 1; i < g1; ++i)
        for(int j = 1; j < g1; ++j)
            if( i*i + j*j == g1*g1 && i+j>g1 ) {
                G1.push_back( point(i, j) );
                G1.push_back( point(-i, j) );
                G1.push_back( point(i, -j) );
                G1.push_back( point(-i, -j) );
            }

    queue<point> Q;
    Q.push( c );
    A[0][c.y][c.x] = 0;
    while( !Q.empty() ) {
        point t = Q.front(); Q.pop();
        bfs(t, Q, 0);
    }
    queue<point> T; T.push( g );
    A[1][g.y][g.x] = 0;
    while( !T.empty() ) {
        point t = T.front(); T.pop();
        bfs(t, T, 1);
    }


    if( ans == INF ) printf("0\n");
    else printf("%d\n", ans); 
    return 0;
}
