// 標準入力
var fs = require('fs'),
    length = fs.fstatSync(process.stdin.fd).size,
    buffer = new Buffer(length),
    bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
    input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();
  
// ここから
function main(){
  var readLines = 0;
  while(true){
    var fieldInfo = input[readLines].split(' ');
    var width = fieldInfo[0] - 0;//toInt
    var height = fieldInfo[1] - 0;//toInt
      
    // 0 0が入力された
    if(!width && !height){
      break;
    }
  
    var start;
    var goal;
    var elem = [[],[],[],[],[]]; // 場にいるパチモン[属性][属性内連番]
    var c;
    var rowData;
    var elemCache;
    var y;
    var x;
    var e1 = 0;
    var e2 = 0;
    var e3 = 0;
    var e4 = 0;
    var e5 = 0;
    var elemCache1 = elem[0];
    var elemCache2 = elem[1];
    var elemCache3 = elem[2];
    var elemCache4 = elem[3];
    var elemCache5 = elem[4];
      
    for(y = height; y--;){// reverse loop
      readLines++;//1行進める
      rowData = input[readLines];
      for(x = width; x--;){// reverse loop
        c = rowData[x];

        switch(c){
        case '.':
          break;
        case '1':
          elemCache1[e1]=pos(x,y);
          e1++;
          break;
        case '2':
          elemCache2[e2]=pos(x,y);
          e2++;
          break;
        case '3':
          elemCache3[e3]=pos(x,y);
          e3++;
          break;
        case '4':
          elemCache4[e4]=pos(x,y);
          e4++;
          break;
        case '5':
          elemCache5[e5]=pos(x,y);
          e5++;
          break;
        case 'S':
          start = pos(x,y);
          break;
        case 'G':
          goal = pos(x,y);
          break;
        }
          
      }
    }
  
    // ブロックスコープが無いから変数宣言をまとめる
    var selectElem;
    var INF = 1 << 30;
    var bestElement = -1;
    var currentDisance;
    var nearestDistance = INF;
    var dp; // 距離[属性][同じ属性内の連番]
    var i; // loop index
    var j;
    var e;
    var len;
    var dpCacheNow; // cache of dp[i] for loop
    var dpCacheNowi; // cache of dp[now][i]
    var dpCacheNext; // cache of dp[i + 1] for loop
    var elemCacheNow;
    var elemCacheNowi; // cache of elem[now][i]
    var elemCacheNext;
    var now;
    var nowLength;
    var next;
    var nextLength;
      
    // 最初に選ぶ属性ごとにループ
    for (selectElem = 0; selectElem < 5; selectElem++) {
      dp = [[],[],[],[],[]]; // 距離[属性][同じ属性内の連番]
  
      for(i = 5; i--;){// reverse loop
        len  = elem[i].length;
        dp[i].length = len;
        dpCache = dp[i];
        while(len--){// reverse loop
          dpCache[len] = INF;
        }
      }
        
      now = (selectElem + 1) % 5;
      nowLength = elem[now].length;
      dpCacheNow = dp[now];
      elemCacheNow= elem[now];
        
      for (i = 0; i < nowLength; i++) {
        // s→e1を計算
        dpCacheNow[i] = dist(start, elemCacheNow[i]);
      }
                        
      // s->1->2->3->4->g
      // なので、ループは間の-> * 3分まわす
      for (e = 0; e < 3; e++) {
        // e(x)->e(x+1)
        next = (now + 1) % 5;
        dpCacheNext = dp[next];
        elemCacheNext = elem[next];
        nextLength = elemCacheNext.length;
        for (i = 0; i < nowLength; i++) {
          dpCacheNowi = dpCacheNow[i];
          elemCacheNowi = elemCacheNow[i];
   
          if(dpCacheNowi >= nearestDistance){
            // 既に決まっている最短距離を超えたら絶対に候補ではない
            continue;
          }
   
          for (j = 0; j < nextLength; j++) {
            dpCacheNext[j] = min(dpCacheNext[j], dpCacheNowi + dist(elemCacheNowi, elemCacheNext[j])); // メモと新しい経路の最短
          }
        }
          
        now = next;
        dpCacheNow = dpCacheNext;
        elemCacheNow = elemCacheNext;
        nowLength = nextLength;
      }
  
      for (i = 0; i < nextLength; i++) {
        // e4->g
        currentDistance = dpCacheNext[i] + dist(elemCacheNext[i], goal);
                          
        if (currentDistance < nearestDistance) {
          nearestDistance = currentDistance;
          bestElement = selectElem;
        }
          
      }
        
    }
      
    if (nearestDistance == INF) {
      console.log("NA");
    } else {
      console.log((bestElement + 1) + " " + nearestDistance);
    }
                  
    readLines++;
  }
    
}
                  
function dist(from, to){
  // x座標とy座標の切り出し(10ビット右シフトでxを、1023 = 2^10 -1とのAND演算でyを取り出す)
  return abs((from >> 10) - (to >> 10)) + abs((from & 0x3FF) - (to & 0x3FF));
}
                  
function min(a, b){
  // ビット演算で高速化
 return b + ((a - b) & ((a - b) >> 31));// 変数宣言よりもこっちの方が高速
}
                  
function pos(a, b){
  // オブジェクトのインスタンス作るよりもプリミティブの方が早い
  // 座標はたかだか1k * 1kなので上位ビットと下位ビットで保持する
  return (a << 10) + b;
}
                 
function abs(a){
 // ビット演算で高速化
  var t = a >> 31;
  return (a ^ t) - t;
}

Measured memory_bytes: 41536