#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int>P;
#define fi first
#define se second

int dist(P a,P b){
    return abs(a.fi-b.fi)+abs(a.se-b.se);
}

struct Data{
    P p;
    int type;

    Data(P p,int type):p(p),type(type){}
    Data(){}

    bool operator<(const Data &d)const{
        if(p!=d.p)return p<d.p;
        return type<d.type;
    }
};
int H,W;
char fld[1001][1001];
void solve(){

    P Start,Goal;
    vector<P>Monster[5];

    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            char c=fld[i][j];
            P p(i,j);
            if(c=='S')Start=p;
            else if(c=='G')Goal=p;
            else{
                for(int k=0;k<5;k++){
                    if(c==k+'1'){
                        Monster[k].push_back(p);
                        break;
                    }
                }
            }
        }
    }


    map<Data,int>prev;
    for(int i=0;i<5;i++){
        prev[Data(Start,i)]=0;
    }

    for(int i=0;i<4;i++){
        map<Data,int>next;
        for(map<Data,int>::iterator it=prev.begin();it!=prev.end();it++){
            int to=(it->first.type+1)%5;
            for(int j=0;j<Monster[to].size();j++){
                P &p=Monster[to][j];
                Data d(p,to);
                if(next.find(d)!=next.end())next[d]=min(next[d],it->second+dist(it->first.p,p));
                else next[d]=it->second+dist(it->first.p,p);
            }
        }
        prev=next;
    }
    P ans(INT_MAX,0);
    for(map<Data,int>::iterator it=prev.begin();it!=prev.end();it++){
        ans=min(ans,P(dist(it->first.p,Goal)+it->second,it->first.type));
    }

    if(ans.first==INT_MAX)cout<<"NA"<<endl;
    else cout<<(ans.second+2)%5<<" "<<ans.first<<endl;
}

int main(){
    cin.tie();
    ios_base::sync_with_stdio(false);

    while(cin>>W>>H,W||H){
        for(int i=0;i<H;i++)cin>>fld[i];
        solve();
    }
}