#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

#define MAX (1000)
#define INF (1<<21)

struct Point{int x, y;};
int H, W, sy, sx, gy, gx, cnt[5];
Point P[5][MAX];
int dp[5][MAX];

int mdist(int x1, int y1, int x2, int y2){
  return (abs(x1-x2) + abs(y1-y2));
}

void compute(){
  int opts, optc = INF;
  int t;
  //s: スタートのお供パチクリの属性
  //t: 1).最初のパチクリが捕まえられるパチクリの属性, 2).最後に捕まえるべきパチクリの属性
  for(int s = 0; s < 5; s++){
    for(int i = 0; i < 5; i++) for(int j = 0; j < cnt[i]; j++) dp[i][j] = INF;

    //最初に捕まえるパチクリへの最短距離は、そのパチクリとスタートとのマンハッタン距離に等しい
    t = (s + 1) % 5;
    for(int j = 0; j < cnt[t]; j++) dp[t][j] = mdist(sx, sy, P[t][j].x, P[t][j].y);

    //その後は漸化式で最短距離を求めていく
    //b: 今の捕まえたパチクリ
    //e: 次に捕まえられるパチクリ
    for(int i = s + 1; i < s + 5; i++){
      int b = i % 5;
      int e = (i + 1) % 5;
      for(int k = 0; k < cnt[b]; k++) for(int l = 0; l < cnt[e]; l++){
        dp[e][l] = min(dp[e][l], dp[b][k] + mdist(P[b][k].x, P[b][k].y, P[e][l].x, P[e][l].y));
      }
    }

    t = (s + 4) % 5;
    for(int j = 0; j < cnt[t]; j++){
      if(dp[t][j] + mdist(gx, gy, P[t][j].x, P[t][j].y) < optc){
        optc = dp[t][j] + mdist(gx, gy, P[t][j].x, P[t][j].y);
        opts = s;
      }
    }
  }
  if(optc == INF) cout << "NA" << endl;
  else cout << opts+1 << " " << optc << endl;
}

int main(void){
  char ch;
  while(cin >> W >> H, W){
    for(int i = 0; i < 5; i++) cnt[i] = 0;
    for(int y = 0; y < H; y++){
      for(int x = 0; x < W; x++){
        cin >> ch;
        if(ch == '.') continue;
        if(ch == 'S'){
          sy = y; sx = x;
        }else if(ch == 'G'){
          gy = y; gx = x;
        }else{
          int p = ch - '0' - 1;
          //属性pのcnt[p]番目のパチクリの座標を設定する
          P[p][cnt[p]].x = x;
          P[p][cnt[p]].y = y;
          //属性pのパチクリの数をカウントする
          cnt[p]++;
        }
      }
    }
    compute();
  }
  return 0;
}