#include<iostream>
#include<vector>
using namespace std ;

struct A{
	int X,Y,Pnt ;
};

int N , M , tmp ;
int table[110][110] ;
int photo[4][60][60];
vector<A> V[4] ;
A temp ;
int dx[] = {-1,0,1,0} ;
int dy[] = {0,-1,0,1} ;

void Search( int p , int nx , int ny ){
	temp.X = nx ; temp.Y = ny ;
	temp.Pnt = photo[p][ny][nx] ;
	V[p].push_back( temp ) ;
	photo[p][ny][nx] = -1 ;
	
	for( int k=0 ; k<4 ; k++ ){
		if( 0 <= nx+dx[k] && nx+dx[k] < M &&
			0 <= ny+dy[k] && ny+dy[k] < M && 
			photo[p][ny+dy[k]][nx+dx[k]] >= 0 ){
				Search( p , nx+dx[k] , ny+dy[k] ) ;
		}
	}
}

void func(){
	A Ans ;
	Ans.X = 1000 ; Ans.Y = 1000 ;
	for( int y=0 ; y<N ; y++ ){
		for( int x=0 ; x<N ; x++ ){
			for( int k=0 ; k<4 ; k++ ){
				bool b = true ;
				for( int i=0 ; b && i < V[k].size() ; i++ ){
					if(  !( 0 <= y+V[k][i].Y && y+V[k][i].Y < N &&
							0 <= x+V[k][i].X && x+V[k][i].X < N )  ){ b = false ; }
					else if( table[y+V[k][i].Y][x+V[k][i].X] != V[k][i].Pnt ) b = false ;
				}
				if( b ){
					if( Ans.Y > y+V[k][0].Y || ( Ans.Y == y+V[k][0].Y && Ans.X > x+V[k][0].X ) ){
						Ans.X = x+V[k][0].X ;
						Ans.Y = y+V[k][0].Y ;
					}
				}
			}
		}
	}
	if( Ans.X == 1000 ) cout << "NA" << endl ;
	else cout << Ans.X+1 << " " << Ans.Y+1 << endl ;
}

int main(){
	
	while( cin >> N >> M , N ){
		for( int i=0 ; i<N ; i++ ){
			for( int j=0 ; j<N ; j++ ){
				cin >> table[i][j] ;
			}
		}
		for( int i=0 ; i<M ; i++ ){
			for( int j=0 ; j<M ; j++ ){
				cin >> tmp ;
				photo[0][i    ][j    ] = tmp ;
				photo[1][j    ][M-i-1] = tmp ;
				photo[2][M-i-1][M-j-1] = tmp ;
				photo[3][M-j-1][i    ] = tmp ;
			}
		}
		
		for( int k=0 ; k<4 ; k++ ){
			bool a = true ;
			V[k].clear() ;
			for( int i=0 ; a && i<M ; i++ ){
				for( int j=0 ; a && j<M ; j++ ){
					if( photo[k][i][j] >= 0 ){
						Search( k , j , i ) ;
						a = false ;
					}
				}
			}
		}
		
		func() ;
	}
	
return 0 ;
}