#include<iostream>
using namespace std;
int n, m, A[205][205];
int visited[205][205];
int x, y, e, f;
int rs[4] = {-1, 0, 1, 0};
int cs[4] = {0, 1, 0, -1};
int top;
int top2;
int start;
int start2;
int queue[40000];
int queue2[40000];
int congchua(int p, int q){
visited[p][q] = true;
int c, d;
int b1, b2;
//int min = 3000;
while(top!=start && top2!=start2){
c = queue[start];
start++;
d = queue2[start2];
start2++;
//if(c==e && d == f) break;
for(int i=c+1; i<=n; i++){
if(A[i][d]==1) break;
if(A[i][d]==0 && visited[i][d]==false){
queue[top] = i;
queue2[top2] = d;
top++;
top2++;
visited[i][d]=visited[i][d] + 1;
A[i][d] = A[c][d]+1;
}
}
for(int i=c-1; i>=0; i--){
if(A[i][d]==1) break;
if(A[i][d]==0 && visited[i][d]==false){
queue[top] = i;
queue2[top2] = d;
top++;
top2++;
visited[i][d]=visited[i][d] + 1;
A[i][d] = A[c][d]+1;
}
}
for(int i=d+1; i<=m; i++){
if(A[c][i]==1) break;
if(A[c][i]==0 && visited[c][i]==false){
queue[top] = c;
queue2[top2] = i;
top++;
top2++;
visited[c][i]=visited[c][i] + 1;
A[c][i] = A[c][d]+1;
}
}
for(int i=d-1; i>=0; i--){
if(A[c][i] == 1) break;
if(A[c][i]==0 && visited[c][i]==false){
queue[top] = c;
queue2[top2] = i;
top++;
top2++;
visited[c][i]=visited[c][i] + 1;
A[c][i] = A[c][d]+1;
}
}
}
if(visited[e][f]==true) return A[e][f]-1;
return -1;
}
int main(){
// freopen("in.txt", "r", stdin);
int t;
cin>>t;
for(int tc=1; tc<=t; tc++){
cin>>m>>n;
cin>>y>>x;
cin>>f>>e;
char s;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
cin>>s;
if(s=='1') A[i][j]=1;
else A[i][j]=0;
}
for(int i=0; i<=n+1; i++)
for(int j=0; j<=m+1; j++){
visited[i][j] = false;
if(i==0||j==0||i==n+1||j==m+1) A[i][j]=1;
}
top=1; top2 = 1;
start=0;
start2 = 0;
queue[0] = x;
queue2[0] = y;
cout<<congchua(x,y)<<endl;
}
return 0;
}