#include <stdio.h>
#include <queue>
using namespace std;
#define MAX 55
#define INF 987654321
int map[MAX][MAX];
int visited1[MAX][MAX];
int visited2[MAX][MAX];
int dcount[MAX][MAX];
int position[4][2] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
int R, C;
int result = INF;
int target_x, target_y;
queue<pair<pair<int, int>, int>>q;
void bfs()
{
int i;
int dx, dy, dq, dw, dop;
while (q.size())
{
dx = q.front().first.first;
dy = q.front().first.second;
dop = q.front().second;
q.pop();
if (dx == target_x && dy == target_y)
{
result = dcount[dx][dy];
return;
}
for (i = 0; i < 4; i++)
{
dq = dx + position[i][0];
dw = dy + position[i][1];
if (dq < 0 || dw < 0 || dq >= R || dw >= C)
{
continue;
}
if (dop == 0)
{
if (map[dq][dw] == 'X' || map[dq][dw] == 'D')
{
continue;
}
if (visited1[dq][dw])
{
visited1[dq][dw] = 0;
map[dq][dw] = '*';
q.push({ { dq, dw }, dop });
}
}
if (dop == 1)
{
if (map[dq][dw] == '*' || map[dq][dw] == 'X')
{
continue;
}
if (visited2[dq][dw] && (map[dq][dw] == '.' || map[dq][dw] == 'D'))
{
dcount[dq][dw] = dcount[dx][dy] + 1;
visited2[dq][dw] = 0;
q.push({ { dq, dw }, dop });
}
}
}
}
}
int main()
{
//freopen("input.txt", "r", stdin);
scanf("%d %d", &R, &C);
int i, j;
for (i = 0; i < R; i++)
{
for (j = 0; j < C; j++)
{
scanf(" %1c", &map[i][j]);
visited1[i][j] = 1;
visited2[i][j] = 1;
if (map[i][j] == '*')
{
q.push({ { i, j }, 0 });
visited1[i][j] = 0;
}
if (map[i][j] == 'S')
{
q.push({ { i, j }, 1 });
visited2[i][j] = 0;
}
if (map[i][j] == 'D')
{
target_x = i;
target_y = j;
}
}
}
bfs();
if (result == INF)
{
printf("KAKTUS");
}
else
{
printf("%d", result);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxxdWV1ZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgTUFYIDU1CiNkZWZpbmUgSU5GIDk4NzY1NDMyMQoKaW50IG1hcFtNQVhdW01BWF07CmludCB2aXNpdGVkMVtNQVhdW01BWF07CmludCB2aXNpdGVkMltNQVhdW01BWF07CmludCBkY291bnRbTUFYXVtNQVhdOwppbnQgcG9zaXRpb25bNF1bMl0gPSB7IHsgLTEsIDAgfSwgeyAwLCAtMSB9LCB7IDEsIDAgfSwgeyAwLCAxIH0gfTsKaW50IFIsIEM7CmludCByZXN1bHQgPSBJTkY7CmludCB0YXJnZXRfeCwgdGFyZ2V0X3k7CgpxdWV1ZTxwYWlyPHBhaXI8aW50LCBpbnQ+LCBpbnQ+PnE7Cgp2b2lkIGJmcygpCnsKICAgIGludCBpOwogICAgaW50IGR4LCBkeSwgZHEsIGR3LCBkb3A7CiAgICB3aGlsZSAocS5zaXplKCkpCiAgICB7CiAgICAgICAgZHggPSBxLmZyb250KCkuZmlyc3QuZmlyc3Q7CiAgICAgICAgZHkgPSBxLmZyb250KCkuZmlyc3Quc2Vjb25kOwogICAgICAgIGRvcCA9IHEuZnJvbnQoKS5zZWNvbmQ7CiAgICAgICAgcS5wb3AoKTsKCiAgICAgICAgaWYgKGR4ID09IHRhcmdldF94ICYmIGR5ID09IHRhcmdldF95KQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZGNvdW50W2R4XVtkeV07CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGRxID0gZHggKyBwb3NpdGlvbltpXVswXTsKICAgICAgICAgICAgZHcgPSBkeSArIHBvc2l0aW9uW2ldWzFdOwoKICAgICAgICAgICAgaWYgKGRxIDwgMCB8fCBkdyA8IDAgfHwgZHEgPj0gUiB8fCBkdyA+PSBDKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRvcCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobWFwW2RxXVtkd10gPT0gJ1gnIHx8IG1hcFtkcV1bZHddID09ICdEJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aXNpdGVkMVtkcV1bZHddKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWQxW2RxXVtkd10gPSAwOwogICAgICAgICAgICAgICAgICAgIG1hcFtkcV1bZHddID0gJyonOwogICAgICAgICAgICAgICAgICAgIHEucHVzaCh7IHsgZHEsIGR3IH0sIGRvcCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZG9wID09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChtYXBbZHFdW2R3XSA9PSAnKicgfHwgbWFwW2RxXVtkd10gPT0gJ1gnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZpc2l0ZWQyW2RxXVtkd10gJiYgKG1hcFtkcV1bZHddID09ICcuJyB8fCBtYXBbZHFdW2R3XSA9PSAnRCcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRjb3VudFtkcV1bZHddID0gZGNvdW50W2R4XVtkeV0gKyAxOwogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWQyW2RxXVtkd10gPSAwOwogICAgICAgICAgICAgICAgICAgIHEucHVzaCh7IHsgZHEsIGR3IH0sIGRvcCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgLy9mcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKCiAgICBzY2FuZigiJWQgJWQiLCAmUiwgJkMpOwoKICAgIGludCBpLCBqOwoKICAgIGZvciAoaSA9IDA7IGkgPCBSOyBpKyspCiAgICB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IEM7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIHNjYW5mKCIgJTFjIiwgJm1hcFtpXVtqXSk7CiAgICAgICAgICAgIHZpc2l0ZWQxW2ldW2pdID0gMTsKICAgICAgICAgICAgdmlzaXRlZDJbaV1bal0gPSAxOwogICAgICAgICAgICBpZiAobWFwW2ldW2pdID09ICcqJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcS5wdXNoKHsgeyBpLCBqIH0sIDAgfSk7CiAgICAgICAgICAgICAgICB2aXNpdGVkMVtpXVtqXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1hcFtpXVtqXSA9PSAnUycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHEucHVzaCh7IHsgaSwgaiB9LCAxIH0pOwogICAgICAgICAgICAgICAgdmlzaXRlZDJbaV1bal0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXBbaV1bal0gPT0gJ0QnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRfeCA9IGk7CiAgICAgICAgICAgICAgICB0YXJnZXRfeSA9IGo7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgYmZzKCk7CgogICAgaWYgKHJlc3VsdCA9PSBJTkYpCiAgICB7CiAgICAgICAgcHJpbnRmKCJLQUtUVVMiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwcmludGYoIiVkIiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiAwOwp9