#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
//#include <utility>
#include <set>
#include <iostream>
//#include <memory>
#include <string>
#include <vector>
#include <algorithm>
//#include <functional>
#include <sstream>
//#include <deque>
#include <complex>
#include <stack>
#include <queue>
#include <cstdio>
//#include <cctype>
#include <cstring>
//#include <ctime>
#include <iterator>
#include <bitset>
//#include <numeric>
//#include <list>
//#include <iomanip>

#if __cplusplus >= 201103L
#include <array>
#include <tuple>
#include <initializer_list>
#include <unordered_set>
#include <unordered_map>
#include <forward_list>

#define cauto const auto&
#else

#endif

using namespace std;


namespace{
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef vector<int> vint;
typedef vector<vector<int> > vvint;
typedef vector<long long> vll, vLL;
typedef vector<vector<long long> > vvll, vvLL;

#define VV(T) vector<vector< T > >

template <class T>
void initvv(vector<vector<T> > &v, int a, int b, const T &t = T()){
    v.assign(a, vector<T>(b, t));
}

template <class F, class T>
void convert(const F &f, T &t){
    stringstream ss;
    ss << f;
    ss >> t;
}


#define reep(i,a,b) for(int i=(a);i<(b);++i)
#define rep(i,n) reep((i),0,(n))
#define ALL(v) (v).begin(),(v).end()
#define PB push_back
#define F first
#define S second
#define mkp make_pair
#define RALL(v) (v).rbegin(),(v).rend()


#define MOD 1000000007LL
#define EPS 1e-8
static const int INF=1<<24;
int calc(pii a,pii b){
	return abs(a.F-b.F)+abs(a.S-b.S);
}
void mainmain(){
	int h,w;
	while(cin>>w>>h,h||w){
		vector<vector<pii>> vv(5);
		pii S,G;
		rep(i,h){
			rep(j,w){
				char t;
				cin>>t;
				if(t=='S'){
					S=mkp(i,j);
				}
				else if(t=='G'){
					G=mkp(i,j);
				}
				else if(t=='.'){
					continue;
				}
				else{
					vv[t-'0'-1].PB(mkp(i,j));
				}
			}
		}
		vector<pii> ans;
		vvint tmp(5);
		rep(j,5){
			rep(k,vv[j].size()){
				tmp[j].PB(INT_MAX);
			}
		}
		rep(i,5){
			bool f=true;
			rep(j,4){
				if(vv[(i+j+1)%5].size()==0) f=false;
			}
			if(!f) continue;
			vvint tt=tmp;
			int st=(i+1)%5;
			rep(j,tt[st].size()){
				tt[st][j]=calc(S,vv[st][j]);
			}
			rep(j,3){
				int pa2=(i+j+2)%5;
				int pa1=(i+j+1)%5;
				rep(k,vv[pa1].size()){
					rep(l,vv[pa2].size()){
						tt[pa2][l]=min(tt[pa2][l],tt[pa1][k]+calc(vv[pa1][k],vv[pa2][l]));
					}
				}
			}
			int t1=INF;
			int t2=(i+4)%5;
			rep(j,tt[t2].size()){
				t1=min(t1,tt[t2][j]+calc(vv[t2][j],G));
			}
			ans.PB(mkp(t1,i));
		}
		if(ans.size()==0){
			puts("NA");
		}
		else{
			sort(ALL(ans));
			// rep(i,ans.size()){
				// cout<<ans[i].S+1<<" "<<ans[i].F<<endl;
			// }
			// cout<<(int)ans.size()<<endl;
			cout<<ans[0].S+1<<" "<<ans[0].F<<endl;
		}
	}
}



}
main() try{
    mainmain();
}
catch(...){
}