#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << ' ' << *it << " = " << a;
  err(++it, args...);
}
inline void op() { cout << '\n'; }
template <typename T, typename... Types>
inline void op(T var1, Types... var2) {
  cout << var1 << ' ';
  op(var2...);
}
inline void ip() {}
template <typename T, typename... Types>
inline void ip(T& var1, Types&... var2) {
  cin >> var1;
  ip(var2...);
}
template <typename T, typename U>
inline void min_self(T& x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
inline void max_self(T& x, U y) {
  if (x < y) x = y;
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> pair) {
  return out << "(" << pair.first << ", " << pair.second << ")";
}
template <class T>
ostream& operator<<(ostream& out, vector<T> vec) {
  for (auto& v : vec) out << v << ' ';
  return out << "\n";
}
template <class T>
ostream& operator<<(ostream& out, set<T> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
template <class L, class R>
ostream& operator<<(ostream& out, map<L, R> vec) {
  out << "(";
  for (auto& v : vec) out << "[" << v.first << ", " << v.second << "]";
  return out << ")";
}
template <class A, class B>
istream& operator>>(istream& in, pair<A, B>& a) {
  return in >> a.first >> a.second;
}
template <class A>
istream& operator>>(istream& in, vector<A>& a) {
  for (A& i : a) in >> i;
  return in;
}
template <class Container>
void split(const std::string& str, Container& cont, char delim = ',') {
  stringstream ss(str);
  string token;
  while (std::getline(ss, token, delim)) {
    cont.push_back(token);
  }
}
long long px[4] = {-1, 0, 1, 0};
long long py[4] = {0, -1, 0, 1};
struct edge {
  long long u, v, wt;
  edge(long long a = 0, long long b = 0, long long c = 0) : u(a), v(b), wt(c) {}
  bool operator<(edge const& other) { return wt < other.wt; }
  friend ostream& operator<<(ostream& out, const edge& x) {
    return out << "(" << x.u << ", " << x.v << ", " << x.wt << ")";
  }
};
void abcd() {
  long long n, m, res = 0;
  ip(n, m);
  string a[n];
  for (long long i = 0; i <= n - 1; i++) ip(a[i]);
  bool vis[n][m];
  memset(vis, false, sizeof(vis));
  long long ex, ey;
  for (long long i = 0; i <= n - 1; i++) {
    for (long long j = 0; j <= m - 1; j++) {
      if (a[i][j] == 'E') {
        ex = i;
        ey = j;
        break;
      }
    }
  }
  long long maxi = INT_MAX;
  long long dist[n][m];
  memset(dist, 0, sizeof(dist));
  queue<pair<long long, long long> > q;
  q.push({ex, ey});
  vis[ex][ey] = true;
  while (!q.empty()) {
    auto [ix, iy] = q.front();
    q.pop();
    if (dist[ix][iy] > maxi) continue;
    for (long long k = 0; k <= 3; k++) {
      long long x = ix + px[k];
      long long y = iy + py[k];
      if (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] && a[x][y] != 'T') {
        dist[x][y] = dist[ix][iy] + 1;
        if (dist[x][y] <= maxi) {
          if (a[x][y] == 'S') {
            maxi = dist[x][y];
          } else {
            res += a[x][y] - '0';
          }
        }
        vis[x][y] = true;
        q.push({x, y});
      }
    }
  }
  op(res);
  return;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long t = 1;
  while (t--) {
    abcd();
  }
  return 0;
}
