#include <bits/stdc++.h>
#define NMAX 105
using namespace std;
struct node
{
int u ;
int v ;
int hp ;
};
int MinDist[NMAX][NMAX][5];
bool visited[NMAX][NMAX][5];
int dx[] = { -1 , 0 , 0 , 1};
int dy[] = { 0 , -1 , 1 , 0};
int row , colum;
char Maze[NMAX][NMAX];
node Start , End;
void enter()
{
cin>> row >>colum;
for(int i = 1 ; i <= row ; i++)
{
string s;
cin>>s;
for(int j = 1 ; j <= colum ; j++)
{
Maze[i][j] = s[j-1];
if(s[j-1] == 'S')
{
Start = { i , j , 3};
}
if(s[j-1] == 'D')
{
End = {i , j , 0};
}
}
}
}
void BFS()
{
deque<node> de;
de.push_back(Start);
visited[Start.u][Start.v][Start.hp] = true;
while(!de.empty())
{
node top = de.front();
de.pop_front();
int i = top.u;
int j = top.v;
for(int k = 0 ; k <= 3 ; k++)
{
int u = i + dx[k];
int v = j + dy[k];
int hp = top.hp;
if( 1 <= u && u <= row && 1 <= v && v <= colum)
{
if(Maze[u][v] == '+') --hp;
if(hp <= 0) continue;
if( !visited[u][v][hp])
{
visited[u][v][hp] = true;
MinDist[u][v][hp] = MinDist[i][j][top.hp] + 1;
de.push_back({u,v,hp});
}
}
}
}
}
void process()
{
BFS();
int ans = INT_MAX;
for(int hp = 1; hp <= 3; hp++) if(MinDist[End.u][End.v][hp]) ans = min(ans , MinDist[End.u][End.v][hp]);
cout<< ((ans == INT_MAX) ?-1:ans) ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cout.tie(nullptr);
enter();
process();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgTk1BWCAxMDUKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IG5vZGUKewogICAgICAgIGludCB1IDsKICAgICAgICBpbnQgdiA7CiAgICAgICAgaW50IGhwIDsKfTsKaW50IE1pbkRpc3RbTk1BWF1bTk1BWF1bNV07CmJvb2wgdmlzaXRlZFtOTUFYXVtOTUFYXVs1XTsKaW50IGR4W10gPSB7IC0xICwgMCAsIDAgLCAxfTsKaW50IGR5W10gPSB7IDAgLCAtMSAsIDEgLCAwfTsKCmludCByb3cgLCBjb2x1bTsKY2hhciBNYXplW05NQVhdW05NQVhdOwpub2RlIFN0YXJ0ICwgRW5kOwoKdm9pZCBlbnRlcigpCnsKICAgICAgICBjaW4+PiByb3cgPj5jb2x1bTsKICAgICAgICBmb3IoaW50IGkgPSAxIDsgaSA8PSAgcm93IDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cmluZyBzOwogICAgICAgICAgICAgICAgY2luPj5zOwogICAgICAgICAgICAgICAgZm9yKGludCBqID0gMSA7IGogPD0gY29sdW0gOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hemVbaV1bal0gPSBzW2otMV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZihzW2otMV0gPT0gJ1MnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgPSB7IGkgLCBqICwgM307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNbai0xXSA9PSAnRCcpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgPSB7aSAsIGogLCAwfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIH0KfQoKdm9pZCBCRlMoKQp7CiAgICAgICAgZGVxdWU8bm9kZT4gZGU7CiAgICAgICAgZGUucHVzaF9iYWNrKFN0YXJ0KTsKICAgICAgICB2aXNpdGVkW1N0YXJ0LnVdW1N0YXJ0LnZdW1N0YXJ0LmhwXSA9IHRydWU7CgogICAgICAgIHdoaWxlKCFkZS5lbXB0eSgpKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG5vZGUgdG9wID0gZGUuZnJvbnQoKTsKICAgICAgICAgICAgICAgIGRlLnBvcF9mcm9udCgpOwoKICAgICAgICAgICAgICAgIGludCBpID0gdG9wLnU7CiAgICAgICAgICAgICAgICBpbnQgaiA9IHRvcC52OwoKICAgICAgICAgICAgICAgIGZvcihpbnQgayA9IDAgOyBrICA8PSAzIDsgaysrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgdSA9IGkgKyBkeFtrXTsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYgPSBqICsgZHlba107CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBocCA9IHRvcC5ocDsKCgogICAgICAgICAgICAgICAgICAgICAgICBpZiggMSA8PSB1ICYmIHUgPD0gcm93ICYmIDEgPD0gdiAmJiB2IDw9IGNvbHVtKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoTWF6ZVt1XVt2XSA9PSAnKycpICAgLS1ocDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaHAgPD0gMCkgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXZpc2l0ZWRbdV1bdl1baHBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRbdV1bdl1baHBdICA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5EaXN0W3VdW3ZdW2hwXSAgPSBNaW5EaXN0W2ldW2pdW3RvcC5ocF0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGUucHVzaF9iYWNrKHt1LHYsaHB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQp9CnZvaWQgcHJvY2VzcygpCnsKICAgICAgICBCRlMoKTsKICAgICAgICBpbnQgYW5zID0gSU5UX01BWDsKCiAgICAgICAgZm9yKGludCBocCA9IDE7IGhwIDw9IDM7IGhwKyspICAgaWYoTWluRGlzdFtFbmQudV1bRW5kLnZdW2hwXSkgICBhbnMgPSBtaW4oYW5zICwgTWluRGlzdFtFbmQudV1bRW5kLnZdW2hwXSk7CgogICAgICAgIGNvdXQ8PCAoKGFucyA9PSBJTlRfTUFYKSA/LTE6YW5zKSA7Cn0KaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZShudWxscHRyKTsKICAgIGNvdXQudGllKG51bGxwdHIpOwogICAgZW50ZXIoKTsKICAgIHByb2Nlc3MoKTsKICAgIHJldHVybiAwOwp9Cg==