#include <iostream>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;
string mapp="0123456789";
int main()
{
for (;1!=0;){
int c,r;
cin >> c >> r;
struct point{
int x,y;
}start,destination;
if (c==0&&r==0)break;
map< int,deque<char> >graph;
for (int c1(0);c1<r;c1++){
string ab;
cin >> ab;
for (int c2(0);c2<c;c2++){
char a;
a=ab[c2];
graph[c1].push_back(a);
if (a=='S'){start.x=c2;start.y=c1;}
if (a=='D'){destination.x=c2;destination.y=c1;}
}
}
int arr[150][150];
bool check[150][150];
for (int o(0);o<150;o++)for (int jh(0);jh<150;jh++){arr[o][jh]=56266666;check[o][jh]=false;}
deque<int>ycord;
deque<int>xcord;
ycord.push_back(start.y);
xcord.push_back(start.x);
arr[start.y][start.x]=0;
check[start.y][start.x]=true;
for (;!ycord.empty();){
if (xcord[0]!=c-1&&graph[ycord[0]][xcord[0]+1]!='X'){
if (graph[ycord[0]][xcord[0]+1]=='D'&&arr[ycord[0]][xcord[0]+1]>arr[ycord[0]][xcord[0]])arr[ycord[0]][xcord[0]+1]=arr[ycord[0]][xcord[0]];
else if (graph[ycord[0]][xcord[0]+1]!='D') {
if (check[ycord[0]][xcord[0]+1]==false){
ycord.push_back(ycord[0]);
xcord.push_back(xcord[0]+1);
check[ycord[0]][xcord[0]+1]=true;
}
//after element
if (arr[ycord[0]][xcord[0]+1]>arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]][xcord[0]+1]))
arr[ycord[0]][xcord[0]+1]=arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]][xcord[0]+1]);
}
}
//before element
if (xcord[0]!=0&&graph[ycord[0]][xcord[0]-1]!='X'){
if (graph[ycord[0]][xcord[0]-1]=='D'&&arr[ycord[0]][xcord[0]-1]>arr[ycord[0]][xcord[0]])arr[ycord[0]][xcord[0]-1]=arr[ycord[0]][xcord[0]];
else if (graph[ycord[0]][xcord[0]-1]!='D'){
if (check[ycord[0]][xcord[0]-1]==false){
ycord.push_back(ycord[0]);xcord.push_back(xcord[0]-1);
check[ycord[0]][xcord[0]-1]=true;
}
if (arr[ycord[0]][xcord[0]-1]>arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]][xcord[0]-1]))
arr[ycord[0]][xcord[0]-1]=arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]][xcord[0]-1]);
}
}
// Row changing before
if (ycord[0]!=0&&graph[ycord[0]-1][xcord[0]]!='X')
{
if (graph[ycord[0]-1][xcord[0]]=='D'&&arr[ycord[0]-1][xcord[0]]>arr[ycord[0]][xcord[0]])arr[ycord[0]-1][xcord[0]]=arr[ycord[0]][xcord[0]];
else if (graph[ycord[0]-1][xcord[0]]!='D') {
if (check[ycord[0]-1][xcord[0]]==false){
ycord.push_back(ycord[0]-1);
xcord.push_back(xcord[0]);
check[ycord[0]-1][xcord[0]]=true;
}
if (arr[ycord[0]-1][xcord[0]]>arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]-1][xcord[0]]))
arr[ycord[0]-1][xcord[0]]=arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]-1][xcord[0]]);
}
}
// Row after
if (ycord[0]!=r-1&&graph[ycord[0]+1][xcord[0]]!='X')
{
if (graph[ycord[0]+1][xcord[0]]=='D'&&arr[ycord[0]+1][xcord[0]]>arr[ycord[0]][xcord[0]])arr[ycord[0]+1][xcord[0]]=arr[ycord[0]][xcord[0]];
else if (graph[ycord[0]+1][xcord[0]]!='D') {
if (check[ycord[0]+1][xcord[0]]==false){
ycord.push_back(ycord[0]+1);
xcord.push_back(xcord[0]);
check[ycord[0]+1][xcord[0]]=true;
}
if (arr[ycord[0]+1][xcord[0]]>arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]+1][xcord[0]]))
arr[ycord[0]+1][xcord[0]]=arr[ycord[0]][xcord[0]]+mapp.find(graph[ycord[0]+1][xcord[0]]);
}
}
ycord.pop_front();
xcord.pop_front();
}
cout << arr[destination.y][destination.x] << endl;
}
return 0;
}