/*
TASK:hop
LANG:C++
*/
#include <stdio.h>
#include <queue>
#define min(a,b) (a < b ? a : b)
#define max(a,b) (a > b ? a : b)
#define maxval 9999999
#define FOR(i,n) for(int i=0;i<n;i++)

struct t { int x,y; t() {} t(int _x,int _y) { x=_x; y=_y; } };

int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };

int d[1500][1500][2] = {0};

std::queue<t> q;
int x1,y1,x2,y2;
int n,m;
int s[2];

void init() {
     scanf("%d %d",&n,&m);
     scanf("%d %d %d",&x1,&y1,&s[0]);
     scanf("%d %d %d",&x2,&y2,&s[1]);
}
bool over(int xa,int ya,int xb,int yb) {
     return (xa==xb && ya==yb);
}
bool isIn(int xa,int ya) {
     return (xa>=0 && xa<=n && ya>=0 && ya <= m);
}
void bfs(int x,int y,int ind) {
     d[x][y][ind] = 1;
     q.push( t(x,y) );
     while(!q.empty()) {
        t f = q.front();
        q.pop();
        FOR(i,4) 
        {
           int nx,ny;
           nx = f.x + dx[i] * s[ind];
           ny = f.y + dy[i] * s[ind]; 
           if(isIn(nx,ny) && d[nx][ny][ind] == 0) {
             d[nx][ny][ind] = d[f.x][f.y][ind] + 1;
             q.push( t(nx,ny) );
           }
        }
     }
}

int main() {
    init();
    bfs(x1,y1,0);
    bfs(x2,y2,1);
    int best = maxval;
    for(int i=0;i<=n;i++) {
       for(int j=0;j<=m;j++) {
          if(d[i][j][0] != 0 && d[i][j][1] != 0) {
            int cur = max(d[i][j][0], d[i][j][1]);
            best = min(best, cur);
          }
          
       }
    }
    printf("%d\n",(best == maxval) ? 0 : (best-1));
    scanf("%d",&best);
    return 0;
}
