/*
TASK: hop
LANG: C++
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 1510
#define INF (int)1e9

 int z;
 int move[MAXN][2];
 int marked[MAXN][MAXN];
 pair<int,int> a[MAXN*MAXN];
 int v[MAXN*MAXN];
 int u[MAXN*MAXN];
 int sr[MAXN*MAXN];
 int A,B;
 int n,m;
 int res;

 void put (int x,int y)
  {
   move[z][0]=x;
   move[z][1]=y;
   z++;
  }

 void make_move(int s)
  {
   int i;
   z=0;
   for (i=0;i<=s;i++)
    if (sr[s*s-i*i]!=-1)
     {
      put(i,sr[s*s-i*i]);
      put(-i,sr[s*s-i*i]);
      put(i,-sr[s*s-i*i]);
      put(-i,-sr[s*s-i*i]);
     }
  }  

 void solve (int x,int y,int l,int o[])
  {
   int i,k,t=0;
   make_move(l);
   memset(marked,-1,sizeof(marked));
   marked[x][y]=0;
   a[t].first=x;
   a[t].second=y;
   t++;
   for (i=0;i<t;i++)
    {
     o[x*MAXN+y]=marked[x][y];
     x=a[i].first;
     y=a[i].second;
     for (k=0;k<z;k++)
      if (x+move[k][0]<=n && x+move[k][0]>=0
      &&  y+move[k][1]<=m && y+move[k][1]>=0
      &&  marked[x+move[k][0]][y+move[k][1]]==-1)
       {
        marked[x+move[k][0]][y+move[k][1]]=marked[x][y]+1;
        a[t]=a[i];
        a[t].first+=move[k][0];
        a[t].second+=move[k][1];
        t++;
       }
    }
  }

 void init ()
  {
   memset(sr,-1,sizeof(sr));
   memset(v,-1,sizeof(v));
   memset(u,-1,sizeof(u));
   for (int i=0;i<=n;i++)
    sr[i*i]=i;
  }  
  
 int main ()
  {
   int i,pom,x,y,s;
   scanf("%d%d",&n,&m);
   init();   
   scanf("%d%d%d",&x,&y,&s);
   solve(x,y,s,v);
   scanf("%d%d%d",&x,&y,&s);
   solve(x,y,s,u);
   res=INF;
   for (i=0;i<MAXN*MAXN;i++)
    if (v[i]!=-1 && u[i]!=-1)
     res=min(res,v[i]+u[i]);
   if (res==INF) res=0;
   printf("%d\n",res);
   return 0;
  }
