#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;
}
