A two dimensional array is called a bracket array if each grid contains one of the two possible brackets — "(" or ")". A path through the two dimensional array cells is called monotonous if any two consecutive cells in the path are side-adjacent and each cell of the path is located below or to the right from the previous one. 

A two dimensional array whose size equals n × m is called a correct bracket array, if any string formed by writing out the brackets on some monotonous way from cell (1, 1) to cell (n, m) forms a correct bracket sequence. 

Let's define the operation of comparing two correct bracket arrays of equal size (a and b) like that. Let's consider a given two dimensional array of priorities (c) — a two dimensional array of same size, containing different integers from 1 to nm. Let's find such position (i, j) in the two dimensional array, that ai, j ≠ bi, j. If there are several such positions, let's choose the one where number ci, j is minimum. If ai, j = "(", then a < b, otherwise a > b. If the position (i, j) is not found, then the arrays are considered equal.

Your task is to find a k-th two dimensional correct bracket array. It is guaranteed that for the given sizes of n and m there will be no less than k two dimensional correct bracket arrays.

Input

The first line contains integers n, m and k — the sizes of the array and the number of the sought correct bracket array (1 ≤ n, m ≤ 100, 1 ≤ k ≤ 1018). Then an array of priorities is given, n lines each containing m numbers, number pi, j shows the priority of character j in line i (1 ≤ pi, j ≤ nm, all pi, j are different).

Please do not use the %lld specificator to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specificator.

Output

Print the k-th two dimensional correct bracket array.

Examples

Input

1 2 1
1 2


Output

()


Input

2 3 1
1 2 3
4 5 6


Output

(()
())


Input

3 2 2
3 6
1 4
2 5


Output

()
)(
()

Note

In the first sample exists only one correct two-dimensional bracket array.

In the second and in the third samples two arrays exist.

A bracket sequence is called regular if it is possible to obtain correct arithmetic expression by inserting characters «+» and «1» into this sequence. For example, sequences «(())()», «()» and «(()(()))» are regular, while «)(», «(()» and «(()))(» are not.
import java.io.*;
import java.util.*;
import java.util.Arrays;

public class C {
	
	static final int MAXN = 201;
	static final long BIG = 1000000000000000000L;
	
	int m, n;
	int[] a = new int[MAXN];
	Integer[] p = new Integer[MAXN];
	char[] ans = new char[MAXN];
	
	
	public void solve() throws IOException {
		m = nextInt();
		n = nextInt();
		long k = nextLong();
		for (int i = 0; i < m + n - 1; i++)
			a[i] = m * n + 1;
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++) {
				int x = nextInt();
				a[i + j] = Math.min(a[i + j], x);
			}
		for (int i = 0; i < m + n - 1; i++) p[i] = i;
		Arrays.sort(p, 0, m + n - 1, new Comparator<Integer>() {
			public int compare(Integer x, Integer y) {
				return a[x] - a[y];
			}
		});
		for (int i = 0; i < m + n - 1; i++) {
			int pos = p[i];
			ans[pos] = '(';
			long num = count();
			//System.out.println(i + " " + num);
			if (k > num) {
				k -= num;
				ans[pos] = ')';
			}
		}
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++)
				writer.print(ans[i + j]);
			writer.println();
		}
	}
	
	private long count() {
		long[][] f = new long[MAXN][MAXN];
		f[m + n - 1][0] = 1;
		for (int i = m + n - 1; i > 0; i--)
			for (int j = 0; j < m + n; j++) {
				if (f[i][j] == 0) continue;
				//System.out.println(i + " " + j + " " + f[i][j]);
				if (ans[i - 1] != '(') {
					f[i - 1][j + 1] += f[i][j];
					if (f[i - 1][j + 1] >= BIG)
						f[i - 1][j + 1] = BIG;
				}
				if (ans[i - 1] != ')' && j > 0) {
					f[i - 1][j - 1] += f[i][j];
					if (f[i - 1][j - 1] >= BIG) 
						f[i - 1][j - 1] = BIG;
				}
			}
		return f[0][0];
	}
	

	public static void main(String[] args) throws FileNotFoundException {
		new C().run();
	}

	BufferedReader reader;
	StringTokenizer tokenizer;
	PrintWriter writer;

	public void run() {
		try {
			long tbegin = System.currentTimeMillis();
			reader = new BufferedReader(new InputStreamReader(System.in));
			//reader = new BufferedReader(new InputStreamReader(new FileInputStream("c.inp")));
			tokenizer = null;
			writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
			//writer = new PrintWriter(new FileOutputStream("c.out"));
			solve();
			//reader.close();
			writer.close();
			System.out.println(System.currentTimeMillis() - tbegin + "ms...");
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}

	int nextInt() throws IOException {
		return Integer.parseInt(nextToken());
	}

	long nextLong() throws IOException {
		return Long.parseLong(nextToken());
	}

	double nextDouble() throws IOException {
		return Double.parseDouble(nextToken());
	}

	String nextToken() throws IOException {
		while (tokenizer == null || !tokenizer.hasMoreTokens()) {
			tokenizer = new StringTokenizer(reader.readLine());
		}
		return tokenizer.nextToken();
	}

}
