#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 510, M = 310000, D[2][2] = {{1, -1}, {1, 1}};
const char c[2] = {'/', '\\'};
int T, n, m, dist[M];
char s[N][N];
bool b[M];
vector<pair<int, int>> edges[M];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
inline void add(int u, int v, bool w) {
edges[u].push_back(make_pair(w, v));
edges[v].push_back(make_pair(w, u));
}
inline void build() {
if (s[1][m] == '/')
add(m + 1, 2 * m - 1, 0);
else
add(m + 1, 2 * m - 1, 1);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int k = 0; k < 2; k++) {
int x = i + D[k][0], y = j + D[k][1];
if (x < 1 || x > n + 1 || y < 1 || y > m + 1)
continue;
int sum0 = (i - 1) * (m + 1) + j, sum1 = (x - 1) * (m + 1) + y;
if (s[i][j - (k ^ 1)] == c[k])
add(sum0, sum1, 0);
else
add(sum0, sum1, 1);
}
}
inline void dijkstra() {
memset(b, false, sizeof(b));
memset(dist, 127, sizeof(dist));
dist[1] = 0;
q.push(make_pair(0, 1));
while (!q.empty()) {
pair<int, int> x;
x = q.top();
q.pop();
if (b[x.second]) continue;
b[x.second] = true;
for (int i = 0; i < (int)edges[x.second].size(); i++) {
int v = edges[x.second][i].second;
int w = edges[x.second][i].first;
if (dist[v] > w + dist[x.second] + 0LL)
dist[v] = w + dist[x.second];
q.push(make_pair(dist[v], v));
}
}
for (int i = 1; i <= (n + 1) * (m + 1); i++)
while (!edges[i].empty())
edges[i].pop_back();
}
signed main() {
scanf("%lld%lld", &n, &m);
if ((n + m) & 1) {
puts("NO SOLUTION");
return 0;
}
for (int i = 1; i <= n; i++) {
scanf("%s", s[i] + 1);
getchar();
}
build();
dijkstra();
printf("%lld\n", dist[(n + 1) * (m + 1)]);
return 0;
}