/*
TASK: hop
LANG: C++
*/

#include <cstdio>
#include <cstring>
#include <utility>

#define x first
#define y second

const int MAXN = 1 << 11;//2000
const int MAXM = 1 << 11;
const int MAXD = 1 << 7;
const int INF = 0x3f3f3f3f;

int N, M;
int dx[2][MAXD], dy[2][MAXD], dirs[2];
int dst[2][MAXN][MAXM];
int sx[2], sy[2];
int jl[2];

void bfs (int id) {
	static std::pair <int, int> q[MAXN * MAXM];
	int p3 = 0, nx, ny;
	memset (dst[id], 0x3f, sizeof (dst) / 2);//INF

	q[p3++] = std::make_pair (sx[id], sy[id]);
	dst[id][sx[id]][sy[id]] = 0;

	int i, j;
	for (i = 0; i < p3; ++i) {
//		printf ("pop (%d) %d %d  %d\n", id, q[i].x, q[i].y, dst[id][q[i].x][q[i].y]);
		for (j = 0; j < dirs[id]; ++j) {
			nx = q[i].x + dx[id][j];
			ny = q[i].y + dy[id][j];
			if (nx >= 0 && nx <= N
			 && ny >= 0 && ny <= M
			 && dst[id][nx][ny] == INF) {
				dst[id][nx][ny] = dst[id][q[i].x][q[i].y] + 1;
				q[p3++] = std::make_pair (nx, ny);
			}
		}
	}
}

int main () {
	scanf ("%d %d", &N, &M);

	int i, j, k;
	for (k = 0; k < 2; ++k)
		scanf ("%d %d %d", sx + k, sy + k, jl + k);

	for (k = 0; k < 2; ++k) {
		j = 0;
		dx[k][dirs[k]] =  jl[k]; dy[k][dirs[k]++] =  0;
		dx[k][dirs[k]] =  jl[k]; dy[k][dirs[k]++] =  0;	
		for (i = jl[k] - 1; i; --i) {
			while (j * j + i * i < jl[k] * jl[k]) ++j;
			if (i * i + j * j == jl[k] * jl[k]) {
				dx[k][dirs[k]] =  i; dy[k][dirs[k]++] =  j;
				dx[k][dirs[k]] =  i; dy[k][dirs[k]++] = -j;
				dx[k][dirs[k]] = -i; dy[k][dirs[k]++] =  j;
				dx[k][dirs[k]] = -i; dy[k][dirs[k]++] = -j;
			}
		}
		dx[k][dirs[k]] =  0; dy[k][dirs[k]++] =  j;
		dx[k][dirs[k]] =  0; dy[k][dirs[k]++] = -j;	
	}

	for (k = 0; k < 2; ++k)
		bfs (k);

	int best = INF * 2;
	for (i = 0; i <= N; ++i)
		for (j = 0; j <= M; ++j)
			best <?= dst[0][i][j] + dst[1][i][j];

	printf ("%d\n", best >= INF ? 0 : best);

	return 0;
}
