#include<iostream>

//Memo: 90*n度回転で決まっても90*(n+1)度回転で最小になるかも
//Memo: 最後まで
//Memo: 配列の範囲

const int MAX_N = 100, MAX_M = 50, INF = 1 << 24;
int photo[MAX_N][MAX_N], part[4][MAX_M][MAX_M];//part[n][_][_]: 90*n度回転した写真の一部
int n, m;//n: 写真, m: 一部

void rotate(){
	for(int i=0;i<3;i++){
		for(int j=0;j<m;j++){
			for(int k=0;k<m;k++){
				part[i+1][m-k-1][j] = part[i][j][k];
			}
		}
	}
}

bool can(int index, int x, int y){//(x, y)を左端としてできるか
	for(int j=0;j<m;j++){
		for(int k=0;k<m;k++){
			if(photo[y+j][x+k] != part[index][j][k] && part[index][j][k] != -1)return false;
		}
	}

	return true;
}

void mostLeftTop(int index, int &x, int &y){//part[index]で-1以外の値を取る最左，上の座標をx, yに加える
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			if(part[index][i][j] != -1){
				x += j;
				y += i;
				return;
			}
		}
	}
}

int main(){
	while(std::cin >> n >> m, n){

		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				std::cin >> photo[i][j];
			}
		}

		for(int i=0;i<m;i++){
			for(int j=0;j<m;j++){
				std::cin >> part[0][i][j];
			}
		}

		rotate();

		int x = INF, y = INF;//できたときの左端の座標(最小)

		for(int i=0;i+m<=n;i++){
			for(int j=0;j+m<=n;j++){
				for(int k=0;k<4;k++){
					if(can(k, j, i)){
						int nx = j, ny = i;
						mostLeftTop(k, nx, ny);
						if(ny < y || (ny == y && nx < x))x = nx, y = ny;
					}
				}
			}
		}

		if(x == INF)std::cout << "NA" << std::endl;
		else std::cout << (x+1) << " " << (y+1) << std::endl;
	}
}