#include<stdlib.h>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<time.h>
#include<queue>
using namespace std;
#define INF 10000000
int w,h,sy,sx,gy,gx,a,p,dist=10000000;
int x[5][1001],y[5][1001];
int num[5],d[5000][1002];
char map[1001][1001];
int min(int a,int b){
	if(a<b){
		return a;
	}else{
		return b;
	}
}
int max(int a,int b){
	if(a>b){
		return a;
	}else{
		return b;
	}
}

int kyori(int y1,int x1,int y2,int x2){
	return abs(y1-y2)+abs(x1-x2);
}
void  bfs(int depth,int i,int j){//star含まずgoal含む
	if(depth==4){
		a+=d[i*1000+j][num[(i+1)%5]+1];
		dist=min(dist,a);
		return;
	}else{
		if(depth==1){
			a=d[i*1000+j][num[(i+1)%5]];
		}
		for(int k=0;k<num[(i+1)%5];k++){
			int p=a;
			a+=d[i*1000+j][k];
			bfs(depth+1,(i+1)%5,k);
			a=p;
		}
	}	
}
int main(){
	while(1){
		int t,color,ans=INF;
		cin>>w>>h;
		if(w+h==0)break;
		for(int i=0;i<5;i++){num[i]=0;}		
		for(int i=0;i<h;i++){
			for(int j=0;j<w;j++){
				cin>>map[i][j];
				switch(map[i][j]){
				case 'S':
					sy=i;sx=j;
					break;
				case 'G':
					gy=i;gx=j;
					break;
				case'.':
					break;
				default:
					t=(int)(map[i][j]-'1');
					y[t][num[t]]=j;x[t][num[t]]=i;
					num[t]++;
					break;
				}
			}
		}
		int flg=0;
		for(int i=0;i<5;i++){
			if(num[i]==0)flg++;
		}
		if(flg>=2){
			cout<<"NA"<<endl;
			continue;
		}
		for(int i=0;i<5;i++){//i=color
			if(flg==1&&num[i]!=0)continue;
			for(int j=0;j<num[i];j++){
				for(int k=0;k<num[(i+1)%5]+2;k++){
					if(k==num[(i+1)%5]){//start
						d[i*1000+j][k]=kyori(sy,sx,y[i][j],x[i][j]);
					}else if(k==num[(i+1)%5]+1){//goal
						d[i*1000+j][k]=kyori(gy,gx,y[i][j],x[i][j]);
					}else{
						d[i*1000+j][k]=kyori(y[(i+1)%5][k],x[(i+1)%5][k],y[i][j],x[i][j]);
					}
				}	
			}
		}
		for(int i=0;i<5;i++){
			p=dist;
			for(int j=0;j<num[i];j++){	
				bfs(1,i,j);
			}
			if(p>dist)color=i;
		}
		if(color==0)color=5;
		cout<<color<<' '<<dist<<endl;
	}
	return 0;
}	