/*
TASK:lab101
LANG:C++
*/
#include <iostream>
#include <vector>
#define FOR(i,n) for(int i=0;i<n;i++)
using namespace std;

struct board {
       bool A[5][10];
};
struct situation { 
       int sx,sy,fx,fy,onMove,moves;
};
struct pii { 
       int b1,b2; 
       pii() {}
       pii(int _b1,int _b2) {
               b1 = _b1;
               b2 = _b2;
       }
};
struct state {
       pii b;
       int s; // board and situation -- coded
       state() {}
       state(pii _b,int _s) {
                 b = _b;
                 s = _s;
       }
};
struct state2{ 
       state a;
       int res;
       state2() {}
       state2(state _a,int _res) {
                    a = _a;
                    res = _res;
       }
};
struct change {
       int x,y,x1,y1;
};
vector<state> p;
int n,m;
vector<state2> v;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
vector<change> ch;
int ex,ey;
state st;

int dfs(state);
pii encodeBoard(board x);
board decodeBoard();
int encodeSit();
situation decodeSit();

pii encodeBoard(board x) {
    int ind = 0;
    pii res;
    res.b1 = res.b2 = 0;
    bool b1=true;
    FOR(i,n) FOR(j,m) {
             if(x.A[i][j]==1) {
               if(b1) { res.b1 |= (1<<ind); }
               else res.b2 |= (1<<ind);
             }
             ind++;
             if(ind==25) {
                 ind = 0;
                 b1 = false;
             }
    }
    return res;
}
board decodeBoard(pii b) {
      board res;
      int ind = 0;
      bool b1 = true;
      FOR(i,n) FOR(j,m) {
               if(b1) {
                 if(b.b1 & (1<<ind)) res.A[i][j]=1;
                 else res.A[i][j]=0;
               }
               else { 
                 if(b.b2 & (1<<ind)) res.A[i][j] = 1;
                 else res.A[i][j]=0;
               }
               ind++;
               if(ind==25) {
                 ind = 0;
                 b1 = false;
               }
      }
      return res;
}
int encodeSit(situation x) {
    int res = 0;
    res += x.sx;
    res <<= 4;
    res += x.sy;
    res <<= 4;
    res += x.fx;
    res <<= 4;
    res += x.fy;
    res <<= 4;
    res += x.onMove;
    res <<= 7;
    res += x.moves; 
    return res;
}
situation decodeSit(int x) {
          situation res;
          res.moves = x % (1<<7);
          x >>= 7;
          res.onMove =  x % (1<<4);
          x >>= 4;
          res.fy = x % (1<<4);
          x >>= 4;
          res.fx = x % (1<<4);
          x >>= 4;
          res.sy = x % (1<<4);
          x >>= 4;
          res.sx = x;
          return res;
}

bool inB(int x,int y) {
     return (x>-1 && y>-1 && x<n && y<m);
}
bool eq(state x,state y) { // change it to encode/decode & then compare
     return (x.b.b1==y.b.b1 && x.b.b2==y.b.b2 && x.s==y.s);
}
int found(state s) {
    FOR(i,v.size()) if(eq(v[i].a,s)) return v[i].res;
    //cout << "found = -1\n";
    return -1;
}
bool tooMuch(state cst) {
     situation get = decodeSit(cst.s);
     return get.moves > 99;
}
pii inch(int x,int y) {
     FOR(i,ch.size()) if(ch[i].x==x && ch[i].y==y) return pii(ch[i].x1,ch[i].y1);
     return pii(-1,-1);
}
bool processing(state cst) {
     FOR(i,p.size()) {
        if(eq(p[i],cst)) return true;
     }
     return false;
}
int dfs(state cst) {
    if(tooMuch(cst)) return -1;
    int tmp = found(cst);
    if(tmp != -1) { return tmp; }
    // move
    //cout << "HERE";
    situation sit = decodeSit(cst.s);
    if(processing(cst)) return -1;
    board cboard = decodeBoard(cst.b);
    
    /*
    bool tf = true;
    bool fboard[5][5];
    FOR(i,5) FOR(j,5) fboard[i][j]=0;
    fboard[0][3]=1;
    fboard[1][1] = 1;
    fboard[2][0] = fboard[2][3] = fboard[2][4] = 1;
    FOR(i,n) FOR(j,m) if(fboard[i][j]!=cboard.A[i][j]) {
             tf = false;
             break;
    }
    if(tf) cout << sit.onMove << endl;
    */
    
    int win=-1;
    p.push_back(cst);
    bool did = false;
    if(sit.onMove==1) {
                 //     cout << "HERE";
         FOR(i,4) {
            int nx(sit.fx+dx[i]),ny(sit.fy+dy[i]);
            //cout << nx << " " << ny << endl;
            /*
            if(sit.moves==0) {
                             cout << sit.fx << " " << sit.fy << endl;
                             cout << nx << " " << ny << endl;
            }
            */
            if( inB(nx,ny) && cboard.A[nx][ny]==0 && !(nx==sit.sx && ny==sit.sy) ) {
                if(nx==ex && ny==ey) {
                  return 1;
                }
//                if(sit.moves==0) cout << nx << " " << ny << endl;
                situation nn = sit;
                nn.fx = nx;
                nn.fy = ny;
                nn.moves++;
                nn.onMove = 2;
                state next = cst;
                next.s = encodeSit(nn);
                did = true;
                int cres = dfs(next);
                if(cres != -1 && cres!=1) win = 2;
                if(cres == 1) {    
                   state2 res;
                   res.a = cst;
                   res.res = 1;
                   v.push_back(res);
                   return cres;
                }
            }
         }             
    }
    else if(sit.onMove==2) {
         FOR(i,4) {
                  int nx(sit.sx+dx[i]),ny(sit.sy+dy[i]);
                  if(inB(nx,ny) && cboard.A[nx][ny]==0 && !(nx==sit.sx && ny==sit.sy)) {
                                 if(nx==ex && ny==ey) {
//                                           FOR(k,n) {
//                                                    FOR(k1,m)
//                                                      cout << cboard.A[k][k1] << " ";
//                                                    cout << endl;
//                                           }
                                           return 2;
                                 }
                                 situation nn = sit;
                                 nn.sx = nx;
                                 nn.sy = ny;
                                 nn.onMove = 1;
                                 nn.moves++;
                                 state next = cst;
                                 next.s = encodeSit(nn);
                                 did = true;
                                 int cres = dfs(next);
                                 if(cres!=-1 && cres!=2) win = 1;
                                 if(cres=2) {
                                   state2 res;
                                   res.a = cst;
                                   res.res = 2;
                                   v.push_back(res);
                                   return cres;
                                 }
                  }
         }
    }
    
    // changeSomething ???
    if(sit.onMove==1) {
       //cout << sit.moves << endl;
       pii c = inch(sit.fx,sit.fy);
//       if(sit.fx==2 && sit.fy==0 && sit.moves==1) {
//          cout << "HERE";
//      }
       if(c.b1 != -1) {
              cboard.A[ c.b1 ][ c.b2 ] = !cboard.A[ c.b1 ][ c.b2 ];
              //cout << "HERE";
              /*
              if(sit.moves==2) {
                cout << "HERE" << endl;
                FOR(i,n) { FOR(j,m) cout << cboard.A[i][j] << " " ; cout << endl; }
                cout << sit.fx << " " << sit.fy << " " << sit.sx << " " << sit.sy << endl;
                pii ccode = encodeBoard(cboard);
                //cout << ccode.b1 << " " << ccode.b2 << endl;
              }
              */
              pii ccode = encodeBoard(cboard);
              situation next = sit;
              sit.moves++;
              sit.onMove = 2;
              did = true;
              int cres = dfs(state(ccode,encodeSit(sit)) );
              if(cres != -1 && cres!=1) win = 2;
              if(cres == 1) {
                 state2 res;
                 res.a = cst;
                 res.res = 1;
                 v.push_back(res);
                 return cres;
                 
              }
              cboard.A[c.b1][c.b2]=!cboard.A[c.b1][c.b2];
       }
    }
    else if(sit.onMove==2) {
       pii c = inch(sit.sx,sit.sy);
       if(c.b1 != -1) {
               cboard.A[c.b1][c.b2]=!cboard.A[c.b1][c.b2];
               pii ccode = encodeBoard(cboard);
               situation next = sit;
               sit.moves++;
               sit.onMove=1;
               did = true;
               int cres = dfs(state(ccode,encodeSit(sit)) );
               if(cres != -1 && cres!=2) win = 1;
               if(cres == 2) {
                  state2 res;
                  res.a = cst;
                  res.res = 2;
                  v.push_back(res);
                  return cres;
               }
               cboard.A[c.b1][c.b2]=!cboard.A[c.b1][c.b2];
       }
    }
    if(!did) {
                  //printf("HERE %d",sit.onMove);
                  state2 res;
                  res.a = cst;
                  res.res = (sit.onMove==2) ? 1 : 2;
                  v.push_back(res);
    }
    /*
    else {
        if(sit.onMove==2) {
               sit.moves++;
               sit.onMove=1;
               int cres = dfs(state(cst.b,encodeSit(sit)) );
               if(cres != -1 && cres!=2) win = 1;
               if(cres == 2) {
                  state2 res;
                  res.a = cst;
                  res.res = 2;
                  v.push_back(res);
                  return cres;
               }
        }
        if(sit.onMove==1) { 
               sit.moves++;
               sit.onMove = 2;
               int cres = dfs(state(cst.b,encodeSit(sit)) );
               if(cres != -1 && cres!=1) win = 2;
               if(cres == 1) {
                  state2 res;
                  res.a = cst;
                  res.res = 1;
                  v.push_back(res);
                  return cres;
               }
        }
    }
    */
    p.pop_back();
    state2 res;
    res.a = cst;
    res.res = win;
    v.push_back(res);
    return win;
}
void init() {
     cin >> n >> m;
     board x;
     FOR(i,n) FOR(j,m) cin >> x.A[i][j];
     int chsz = 0;
     cin >> chsz;
     FOR(i,chsz) {
       change cur;
       cin >> cur.x >> cur.y >> cur.x1 >> cur.y1;
       cur.x--; cur.y--; cur.x1--; cur.y1--;
       ch.push_back(cur);
     }
     situation start;
     cin >> start.fx >> start.fy >> start.sx >> start.sy;
     start.sx--; start.sy--;
     start.fx--; start.fy--;
     cin >> ex >> ey;
     ex--; ey--;
     start.moves = 0;
     start.onMove = 1;
     pii b = encodeBoard(x);
     int s = encodeSit(start);
     st.b = b;
     st.s = s;
     #ifdef debugInput
     FOR(i,n) {
              FOR(j,m) cout << x.A[i][j] << " ";
              cout << endl;
     }
     FOR(i,ch.size()) cout << ch[i].x << " " << ch[i].y << " " << ch[i].x1 << " " << ch[i].y1 << endl;
     cout << start.sx << " " << start.sy << " " << start.fx << " " << start.fy << " " << ex << " " << ey << endl;
     #endif
}
int main() {
    /*
    situation x;
    while(cin >> x.sx >> x.sy >> x.fx >> x.fy >> x.onMove >> x.moves) {
              int code = encodeSit(x);
              cout << code << endl;
              situation get = decodeSit(code);
              cout << get.sx << " " << get.sy << " " << get.fx << " " << get.fy << " " << get.onMove << " " << get.moves << endl;    }
    */
    init();
    /*
    pii cur = inch(2,0);
    cout << cur.b1 << " " << cur.b2 << endl;
    */
    int res = dfs(st);
    if(res==-1) {
      cout << 0 << endl;
    }
    else cout << ((res==2) ? 1 : 2) << endl;
    /*
    cout << v.size() << endl;
    FOR(i,v.size()) {
        state cst = v[i].a;
        board cboard = decodeBoard(cst.b);
        FOR(i,n) { FOR(j,m) cout << cboard.A[i][j] << " "; cout << endl; }
    }
    */
    scanf("%d",&n);
    return 0;
}
