#include <bits/stdc++.h>

using i64 = long long;

using namespace std;

template <typename T>
bool chmin(T& a, T b){
    if(a > b){
        a = b;
        return true;
    }
    return false;
}

signed main(){
    int w, h;
    cin >> w >> h;
    vector<string> v(h);
    for(int i = 0; i < h; ++i)
        cin >> v[i];
    vector<int> vx(32, -1);
    vector<int> vy(32, -1);
    for(int i = 0; i < h; ++i){
        for(int j = 0; j < w; ++j){
            if('0' <= v[i][j] && v[i][j] <= '9'){
                vx[v[i][j] - '0'] = i;
                vy[v[i][j] - '0'] = j;
            }
            if('a' <= v[i][j] && v[i][j] <= 'j'){
                vx[10 + v[i][j] - 'a'] = i;
                vy[10 + v[i][j] - 'a'] = j;
            }
            if('A' <= v[i][j] && v[i][j] <= 'J'){
                vx[20 + v[i][j] - 'A'] = i;
                vy[20 + v[i][j] - 'A'] = j;
            }
            if(v[i][j] == 'S'){
                vx[30] = i;
                vy[30] = j;
            }
            if(v[i][j] == 'T'){
                vx[31] = i;
                vy[31] = j;
            }
        }
    }
    int m = 10;
    vector<vector<int>> score(m + 1, vector<int>(m + 1, 0));
    for(int i = 0; i < m; ++i)
        for(int j = 0; j < m; ++j)
            cin >> score[i][j];

    vector<int> dx{1, 0, -1, 0};
    vector<int> dy{0, 1, 0, -1};

    auto f = [&](int sx, int sy){
        vector<vector<int>> dist(h, vector<int>(w, 1e9));
        dist[sx][sy] = 0;
        queue<pair<int,int>> que;
        que.emplace(sx, sy);
        while(!que.empty()){
            int x, y;
            tie(x, y) = que.front();
            que.pop();
            for(int d = 0; d < 4; ++d){
                int nx = x + dx[d];
                int ny = y + dy[d];
                if(nx < 0 || ny < 0 || nx >= h || ny >= w)
                    continue;
                if(v[nx][ny] == '#')
                    continue;
                if(dist[nx][ny] > dist[x][y] + 1){
                    dist[nx][ny] = dist[x][y] + 1;
                    if(v[nx][ny] == '.')
                        que.emplace(nx, ny);
                }
            }
        }
        vector<int> wv(32, 1e9);
        for(int i = 0; i < 32; ++i)
            if(vx[i] != -1){
                wv[i] = dist[vx[i]][vy[i]];
            }
        return wv;
    };
    vector<vector<int>> dist(32, vector<int>(32, 1e9));
    for(int i = 0; i < 32; ++i){
        if(vx[i] != -1){
            dist[i] = f(vx[i], vy[i]);
        }
    }
    vector<vector<vector<pair<i64,i64>>>> a(32, vector<vector<pair<i64,i64>>>(1<<m, vector<pair<i64,i64>>(11, {1e18, 0})));
    a[30][0][10] = {0, 0};
    priority_queue<tuple<i64,i64,int,int,int>, vector<tuple<i64,i64,int,int,int>>, greater<tuple<i64,i64,int,int,int>>> que;
    que.emplace(0, 0, 30, 0, 10);
    while(!que.empty()){
        i64 d, sc;
        int i, j, k;
        tie(d, sc, i, j, k) = que.top();
        que.pop();
        if(a[i][j][k] != make_pair(d, sc))
            continue;
        // 0,9 get item
        for(int to = 0; to < 10; ++to){
            if(chmin(a[to][j][k], {d + dist[i][to], sc}))
                que.emplace(d + dist[i][to], sc, to, j, k);
            if(!(j & (1 << to)))
                if(chmin(a[to][j | (1 << to)][to], {d + dist[i][to], sc - score[k][to]}))
                    que.emplace(d + dist[i][to], sc - score[k][to], to, j | (1 << to), to);
        }
        // a,j
        for(int to = 10; to < 20; ++to){
            if(j & (1 << (to - 10))){
                if(chmin(a[to][j][k], {d + dist[i][to], sc}))
                    que.emplace(d + dist[i][to], sc, to, j, k);
            }
        }
        // A,J
        for(int to = 20; to < 30; ++to){
            if(!(j & (1 << (to - 20)))){
                if(chmin(a[to][j][k], {d + dist[i][to], sc})){
                    que.emplace(d + dist[i][to], sc, to, j, k);
                }
            }
        }
        for(int to = 30; to < 32; ++to)
            if(chmin(a[to][j][k], {d + dist[i][to], sc}))
                que.emplace(d + dist[i][to], sc, to, j, k);
    }
    pair<i64,i64> ans(1e18, -1e18);
    for(auto x : a[31][(1 << m) - 1])
        chmin(ans, x);
    if(ans.first >= 1e9)
        cout << -1 << endl;
    else
        cout << ans.first << " " << -ans.second << endl;

    /*
    for(int i = 0; i < 32; ++i){
        for(int j = 0; j < 32; ++j){
            cout << (dist[i][j] >= 100 ? -1 : dist[i][j]) << " \n"[j == 31];
        }
    }
     */
}


Measured memory_bytes: 18284