#include<bits/stdc++.h>
using namespace std;
bool ves[55][55];
struct node{
long long x,y,step;
};
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
queue<node>q1;
long long n,m,x1,yy1,x2,y2,s[55][55],f[55][55];
void f_bfs(){
while(!q1.empty()){
node nk=q1.front();
q1.pop();
nk.step++;
for(int i=0;i<4;i++){
node c=nk;
c.x+=dx[i],c.y+=dy[i];
if(c.x>=1&&c.x<=n&&c.y>=1&&c.y<=m&&!ves[c.x][c.y]){
f[c.x][c.y]=min(f[c.x][c.y],c.step);
q1.push(c);
ves[c.x][c.y]=1;
}
}
}
}
void ans_bfs(){
queue<node>q;
q.push({x1,yy1,0});
while(!q.empty()){
node nk=q.front();
q.pop();
if(f[nk.x][nk.y]<=nk.step)
continue;
if(nk.x==x2&&nk.y==y2){
cout<<nk.step;
return;
}
nk.step++;
for(int i=0;i<4;i++){
node c=nk;
c.x+=dx[i],c.y+=dy[i];
if(c.x>=1&&c.x<=n&&c.y>=1&&c.y<=m&&!ves[c.x][c.y]&&!s[c.x][c.y]){
q.push(c);
ves[c.x][c.y]=1;
}
}
}
cout<<"KAKTUS";
}
int main(){
cin>>n>>m;
memset(f,127,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
char c;
cin>>c;
if(c=='*'){
f[i][j]=0;
q1.push({i,j,0});
}
else if(c=='D')
x2=i,y2=j;
else if(c=='S')
x1=i,yy1=j;
if(c=='X')
s[i][j]=1;
}
f_bfs();
f[x2][y2]=1e8;
memset(ves,0,sizeof(ves));
ves[x1][yy1]=1;
ans_bfs();
return 0;
}