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

#include <cstdio>
#include <vector>
#include <memory.h>
#include <queue>
using namespace std;

const int MAX_N     = 1500;
const int HASH_SIZE = ((1<<19)-1)*23;   //46MB
const int COEF      = 101*91;
const int INF       = 1000000000;

int n, m;
int x1, y1, d1;
int x2, y2, d2;

int H[HASH_SIZE];
vector< pair<pair<int,int>,int> > coll;
vector< pair<int,int> > M1, M2;

int V[MAX_N][MAX_N]; //9MB

int ans = INF;

void input ()
{
 	scanf ("%d%d", &n, &m);
 	scanf ("%d%d%d", &x1, &y1, &d1);
 	scanf ("%d%d%d", &x2, &y2, &d2);
}

int is_sqr (int a)
{
	int i;
	
	for (i=0; i*i<=a; i++)
		if (i*i==a)
			return i;
			
	return 0;
}

void init ()
{
	int i;
	
	memset (H,-1,sizeof(H));
	
	for (i=0; i<d1; i++) {
		if ( is_sqr(d1*d1-i*i) ) {
			M1.push_back( make_pair(i,is_sqr(d1*d1-i*i)) );
			//printf ("%d %d\n", i, is_sqr(d1*d1-i*i) );
		}
	}

	for (i=0; i<d2; i++)
		if ( is_sqr(d2*d2-i*i) )
			M2.push_back( make_pair(i,is_sqr(d2*d2-i*i)) );
}

inline int hash (int x, int y)
{
	return (x*COEF+y) % HASH_SIZE;
}
/*
void dfs1 (int x, int y, int moves)
{
	if (x<0 || y<0 || x>n || y>m) return;
	
	printf ("dfs1: %d %d %d\n", x, y, moves);
	
	if ( H[hash(x,y)] != -1 ) {
		coll.push_back ( make_pair(make_pair(x,y),moves) );
		return;
	}
	
	H[hash(x,y)] = moves;
	
	for (int i=0; i<M1.size(); i++) {
		dfs1 (x+M1[i].first, y+M1[i].second, moves+1);
		dfs1 (x+M1[i].first, y-M1[i].second, moves+1);
		dfs1 (x-M1[i].first, y+M1[i].second, moves+1);
		dfs1 (x-M1[i].first, y-M1[i].second, moves+1);
	}	
}
*/
void bfs1 ()
{
	int i, dx, dy, newx, newy;
	pair<int,int> p, q;
	queue< pair<int,int> > Q;
	
	Q.push ( make_pair(x1,y1) );
	memset (V,-1,sizeof(V));
	V[x1][y1] = 0;
	
	while (!Q.empty()) {
		p = Q.front();
		Q.pop();
		
		//printf ("bfs1: %d %d %d\n", p.first, p.second, V[p.first][p.second]);
		
		H[hash(p.first,p.second)] = V[p.first][p.second];
		
		for (i=0; i<M1.size(); i++) {
			//printf ("%d", M1[i].first);
			
			for (dx=-1; dx<=1; dx++) if (dx)
				for (dy=-1; dy<=1; dy++) if (dy) {
					q.first  = p.first  + dx*M1[i].first;
					q.second = p.second + dy*M1[i].second;
					if (q.first<0 || q.second<0 || q.first>n || q.second>m) continue;
					
					if ( V[q.first][q.second] == -1 ) {
						Q.push(q);
						V[q.first][q.second] = V[p.first][p.second] + 1;
						//printf ("   %d %d %d\n", q.first, q.second, V[q.first][q.second]);
					}
				}
		}
	}
}

/*
void dfs2 (int x, int y, int moves)
{
	if (x<0 || y<0 || x>n || y>m) return;
	
	printf ("dfs2: %d %d %d\n", x, y, moves);
	
	if ( H[hash(x,y)] != -1 ) {
		ans = min(ans,moves+H[hash(x,y)]);
		H[hash(x,y)] = -1;
	}
	else {
		return;
		
		for (int i=0; i<coll.size(); i++)
			if (coll[i].first.first==x && coll[i].first.second==y)
				ans = min(ans,moves+coll[i].second);
	}
	
	for (int i=0; i<M2.size(); i++) {
		dfs2 (x+M2[i].first, y+M2[i].second, moves+1);
		dfs2 (x+M2[i].first, y-M2[i].second, moves+1);
		dfs2 (x-M2[i].first, y+M2[i].second, moves+1);
		dfs2 (x-M2[i].first, y-M2[i].second, moves+1);
	}	
}
*/

void bfs2 ()
{
	int i, dx, dy, newx, newy;
	pair<int,int> p, q;
	queue< pair<int,int> > Q;
	
	Q.push ( make_pair(x2,y2) );
	memset (V,-1,sizeof(V));
	V[x2][y2] = 0;
	
	while (!Q.empty()) {
		p = Q.front();
		Q.pop();
		
		//printf ("bfs2: %d %d %d\n", p.first, p.second, V[p.first][p.second]);
		
		if (H[hash(p.first,p.second)] != -1)
			ans = min( ans, V[p.first][p.second]+H[hash(p.first,p.second)] );
		
		for (i=0; i<M2.size(); i++) {
			//printf ("%d", M1[i].first);
			
			for (dx=-1; dx<=1; dx++) if (dx)
				for (dy=-1; dy<=1; dy++) if (dy) {
					q.first  = p.first  + dx*M2[i].first;
					q.second = p.second + dy*M2[i].second;
					if (q.first<0 || q.second<0 || q.first>n || q.second>m) continue;
					
					if ( V[q.first][q.second] == -1 ) {
						Q.push(q);
						V[q.first][q.second] = V[p.first][p.second] + 1;
						//printf ("   %d %d %d\n", q.first, q.second, V[q.first][q.second]);
					}
				}
		}
	}
}

void solve ()
{	
	init ();
	bfs1 ();
	bfs2 ();
	//dfs1 (x1,y1,0);
	//dfs2 (x2,y2,0);
}

int main ()
{
	//freopen ("hop.in", "r", stdin);
	
 	input ();
 	solve ();
 	
 	printf ("%d\n", ans);
	
    return 0;
}
