/* 
TASK: hop
LANG: C++
*/
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
int N,M,X1,Y1,X2,Y2,s1,s2;
int sq[]={0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444};
vector<vector<pair<int,int> > > D;
vector<int> u1,u2;
struct edge{
    int d;
    int to;
    bool operator <(edge a) const {
        return d>a.d;
    }
};
vector<int> get_neighbours(int p,int h)
{
    vector<int> r;
    int i,c1=p%N,c2=p/N,f1,f2,s;
    if(h==1)s=s1;
    else s=s2;
    f1=c1+s;f2=c2;if(f1<N)r.push_back(f2*N+f1);
    f1=c1-s;f2=c2;if(f1>=0)r.push_back(f2*N+f1);
    f1=c1;f2=c2+s;if(f2<M)r.push_back(f2*N+f1);
    f1=c1;f2=c2-s;if(f2>=0)r.push_back(f2*N+f1);
    for(i=0;i<D[s*s].size();i++)
    {
        f1=c1+D[s*s][i].first;f2=c2+D[s*s][i].second;
        if(f1>=0&&f1<N&&f2>=0&&f2<M)r.push_back(f2*N+f1);
        f1=c1+D[s*s][i].first;f2=c2-D[s*s][i].second;
        if(f1>=0&&f1<N&&f2>=0&&f2<M)r.push_back(f2*N+f1);
        f1=c1-D[s*s][i].first;f2=c2+D[s*s][i].second;
        if(f1>=0&&f1<N&&f2>=0&&f2<M)r.push_back(f2*N+f1);
        f1=c1-D[s*s][i].first;f2=c2-D[s*s][i].second;
        if(f1>=0&&f1<N&&f2>=0&&f2<M)r.push_back(f2*N+f1);
    }
    return r;
}
void dijkstra(int start,int h)
{
    int i;
    bool f;
    priority_queue<edge> Q;
    vector<int> dist(N*M,INT_MAX),g;
    vector<bool> used(N*M,false);
    edge t,v;
    dist[start]=0;used[start]=true;
    g=get_neighbours(start,h);
    for(i=0;i<g.size();i++)
    {
        t.d=1;t.to=g[i];
        Q.push(t);
        dist[t.to]=1;
    }
    while(1)
    {
        f=false;
        while(!Q.empty())
        {
            t=Q.top();Q.pop();
            if(!used[t.to])
            {
                f=true;
                break;
            }
        }
        if(!f)break;
        used[t.to]=true;
        g=get_neighbours(t.to,h);
        for(i=0;i<g.size();i++)
        {
            if(dist[g[i]]>dist[t.to]+1)
            {
                dist[g[i]]=dist[t.to]+1;
                if(!used[g[i]])
                {
                    v.d=dist[g[i]];v.to=g[i];
                    Q.push(v);
                }
            }
        }
    }
    if(h==1)u1=dist;
    else u2=dist;
}
void round_sq()
{
    int i,j,k;
    D.resize(N*N);
    for(i=0;i<D.size();i++)
        for(j=1;j<39;j++)
            for(k=1;k<39;k++)
                if(sq[j]+sq[k]==i)D[i].push_back(make_pair((int)sqrt(sq[j]),(int)sqrt(sq[k])));
}
int main()
{
    int i,ans=INT_MAX;
    scanf("%d %d",&N,&M);++N;++M;
    scanf("%d %d %d",&X1,&Y1,&s1);
    scanf("%d %d %d",&X2,&Y2,&s2);
    round_sq();
    dijkstra(X1+Y1*N,1);dijkstra(X2+Y2*N,2);
    for(i=0;i<N*M;i++)
        if(u1[i]!=INT_MAX&&u2[i]!=INT_MAX)ans=min(u1[i]+u2[i],ans);
    if(ans!=INT_MAX)printf("%d\n",ans);
    else printf("%d\n",0);
    return 0;
}
