#include<iostream>

const int MAX_N = 100, MAX_M = 50;
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=1;i<4;i++){
		for(int j=0;j<m;j++){
			for(int k=0;k<m;k++){
				part[i][j][k] = part[i-1][m-k-1][j];
			}
		}
	}
}

void showArray2D(int index){
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			printf("%2d ", part[index][i][j]);
		}
		puts("");
	}
}

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

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<MAX_N;i++){
			for(int j=0;j<MAX_N;j++){
				photo[i][j] = 0;
			}
		}

		for(int i=0;i<4;i++){
			for(int j=0;j<MAX_M;j++){
				for(int k=0;k<MAX_M;k++){
					part[i][j][k] = 0;
				}
			}
		}

		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 = -1, y;//できたときの左端の座標
		for(int i=0;i+m<n;i++){
			for(int j=0;j+m<n;j++){
				int res = can(j, i);
				if(res != -1)x = j, y = i, mostLeftTop(res, x, y);
			}
		}

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