/*
 * ACM ICPC - CERC 2011
 *
 * Sample solution: The Grille (grille)
 * Author: Martin Kacer
 */

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class grille {
	StringTokenizer st = new StringTokenizer("");
	BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String[] args) throws Exception {
		grille instance = new grille();
		while (instance.run()) {/*repeat*/}
	}
	String nextToken() throws Exception {
		while (!st.hasMoreTokens()) st = new StringTokenizer(input.readLine());
		return st.nextToken();
	}
	int nextInt() throws Exception {
		return Integer.parseInt(nextToken());
	}
	
	final static int MAX_SIZE = 1000;
	
	char[][] text = new char[MAX_SIZE][], mesh = new char[MAX_SIZE][];
	int[][][] dirs = {{{1,0},{0,1}}, {{0,-1},{1,0}}, {{-1,0},{0,-1}}, {{0,1},{-1,0}}};
	
	boolean run() throws Exception {
		int size = nextInt();
		if (size == 0) return false;
		for (int i = 0; i < size; ++i) mesh[i] = nextToken().toCharArray();
		for (int i = 0; i < size; ++i) text[i] = nextToken().toCharArray();
		for (int d = 0; d < 4; ++d)
			for (int i = 0; i < size; ++i) for (int j = 0; j < size; ++j) {
				int di = (i+1)*dirs[d][0][0]+(j+1)*dirs[d][0][1], dj = (i+1)*dirs[d][1][0]+(j+1)*dirs[d][1][1];
				if (di < 0) di += size; else --di; if (dj < 0) dj += size; else --dj;
				if (mesh[di][dj] != '#')
					System.out.append(text[i][j]);
			}
		System.out.println();
		return true;
	}
}
