#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,amin,r,dist=10000000;
int x[5][1001],y[5][1001];
int num[5],d[5000][1002],dp[5000][5];
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);
}
int f5(int a){
	
	return a;
}
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<5000;i++){
			for(int j=0;j<5;j++){dp[i][j]=INF;}
			for(int j=0;j<1002;j++){d[i][j]=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]]=i;/*今までここでi,jを逆にしていた*/
					x[t][num[t]]=j;
					num[t]++;
					break;
				}
			}
		}
		
		int flg=0;
		for(int i=0;i<5;i++){
			if(num[i]==0){
				r=i;
				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 dpに代入してることに注意
						dp[i*1000+j][4]=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]);
					}
				}	
			}
		}

		if(flg==1){//マップ上で一種類欠如している場合
			for(int dep=3;dep>=1;dep--){
					for(int j=0;j<num[(dep+r)%5];j++){//j=今の色における種類
						int mini=INF;
						for(int k=0;k<num[(r+dep+1)%5];k++){//k=次の色における種類
							mini=min(mini,d[((dep+r)%5)*1000+j][k]/*今からつぎへ*/+dp[((r+dep+1)%5)*1000+k][dep+1]/*次以降*/);
						}
						dp[1000*((r+dep)%5)+j][dep]=mini;
					}		
			}
			ans=INF;
			for(int j=0;j<num[(r+1)%5];j++){
				ans=min(ans,dp[1000*((r+1)%5)+j][1]+d[1000*((r+1)%5)+j][num[(r+2)%5]]/*from start*/);
			}
			
			cout<<r+1<<' '<<ans<<endl;

		}else{//マップ上に全種類いる場合
			for(int dep=3;dep>=1;dep--){
				for(int i=0;i<5;i++){//color
					for(int j=0;j<num[i];j++){//自分のnumber
						int mini=INF;
						for(int k=0;k<num[(i+1)%5];k++){//k=次のやつのnumber
							mini=min(mini,dp[((i+1)%5)*1000+k][dep+1]+d[1000*i+j][k]);
						}
						dp[1000*i+j][dep]=mini;
					}
				}
			}
			for(int i=0;i<5;i++){
				for(int j=0;j<num[(i+1)%5];j++){
					if(ans>dp[1000*i+j][1]+d[1000*i+j][num[(i+1)%5]]){
						color=i;/*iはdepth==1のときの色。だからi+1にはならない*/
						ans=dp[1000*i+j][1]+d[1000*i+j][num[(i+1)%5]];/*start*/
					}
				}
			}
			if(color==0)color=5;
			cout<<color<<' '<<ans<<endl;
		}
	}
	return 0;
}	