#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int, int> PII;
const int N = 505;
char a[N][N];//存放线路
int d[N][N];//存放该点与起点(0,0)的距离
int n, m;
deque<PII> q;//存放点的坐标
int Bfs()
{
q.push_front({0, 0});
//每次需要初始化距离
memset(d, 0x3f, sizeof(d));
//设置四个方向,该方向表示该点到别的点的坐标转化
int dx[4] = {-1, -1, 1, 1}, dy[4] = {-1, 1, 1, -1};
//设置四个方向,该方向表示该点到周围四个线段坐标的转化 ,这些线段都是与该点连接的
int ix[4] = {-1, -1, 0, 0}, iy[4] = {-1, 0, 0, -1};
d[0][0] = 0;
//四个方向对应四条线路状态
char cs[5] = "\\/\\/";
while(q.size())
{
PII it = q.front();//取出队头
q.pop_front();//弹出队头
//如果找到终点,则结束
if(it.first == n && it.second == m) return d[it.first][it.second];
for(int i = 0; i < 4; i++)
{
int x = it.first + dx[i];
int y = it.second + dy[i];
//不合法则跳过
if(x < 0 || y < 0 || x > n || y > m) continue;
//找到该点周围四条线段的坐标
int gx = it.first + ix[i], gy = it.second + iy[i];
//w代表是否连通,1代表不连通,0代表连通
int w = (a[gx][gy] != cs[i]);
//更新此点的距离
int dist = d[it.first][it.second] + w;
if(dist < d[x][y])
{
d[x][y] = dist;
//优先考虑连通的状态 , 优先状态放在队头, 不优先则放在队尾
if(w) q.push_back({x, y});
else q.push_front({x, y});
}
}
}
return -1;
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> m;
//输入数据
for(int i = 0; i < n; i++) cin >> a[i];
//判断题目可以看出当行+列为偶数时是没有答案的
if((n + m) % 2 == 1) cout << "NO SOLUTION" << endl;
else cout << Bfs() << endl;
}
return 0;
}