 #include <iostream>
#include <set>

using namespace std;

set <string> S;

void FIZMAT_4EVER() {
	if (double(clock())/double(CLOCKS_PER_SEC) > 1.8) {
		printf("TOO MANY\n");
		exit(0);
	}
}

struct PENTO {
	int a,b;
	bool used;
	char ch[11][11];

	void read() {
		used=0;
		cin >> a >> b;
		for (int i=0; i < a; i++)
			for (int j=0; j < b; j++)
				cin >> ch[i][j];
	}

	void reverse() {
		char tmp[22][22];
		for (int i=0; i < a; i++)
			for (int j=0; j < b/2; j++)
				swap(ch[i][j],ch[i][b-j-1]);
		for (int i=0; i < a; i++)
			for (int j=0; j < b; j++)
				tmp[i][j]=ch[i][j];
		for (int i=0; i < a; i++)
			for (int j=0; j < b; j++)
				ch[j][i]=tmp[i][j];
		swap(a,b);
	}

	void print() {
		for (int i=0; i < a; i++) {
			for (int j=0; j < b; j++)
				cout << ch[i][j];
			cout << "\n";
		}	
	}


} a[25]; 

int n,m,k;
char Z[11][11];

void asd() {
	for (int i=0; i < n; i++) {
		for (int j=0; j < m; j++)
			cout << Z[i][j];
		cout << "\n";
	}	

}



bool _check(int x, int y, PENTO &P) {
	FIZMAT_4EVER();
	if (P.used == 1) return 0;
	if (P.a + x <= n && P.b + y <= m) {
		bool yes=0;
		for (int i=0; i < P.a; i++) {
			for (int j=0; j < P.b; j++) {
				if (P.ch[i][j] != '.' && Z[i+x][j+y] != '.') {
					yes=1;
					break;

				}
				if (yes) break;
			}	
			if (yes) break;
		}
		if (!yes) return 1;
	}
	P.reverse();

	if (P.a + x <= n && P.b + y <= m) {
		bool yes=0;
		for (int i=0; i < P.a; i++) {
			for (int j=0; j < P.b; j++) {
				if (P.ch[i][j] != '.' && Z[i+x][j+y] != '.') {
					yes=1;
					break;

				}
				if (yes) break;
			}	
			if (yes) break;
		}
		if (!yes) return 1;
	}
	P.reverse();
	if (P.a + x <= n && P.b + y <= m) {
		bool yes=0;
		for (int i=0; i < P.a; i++) {
			for (int j=0; j < P.b; j++) {
				if (P.ch[i][j] != '.' && Z[i+x][j+y] != '.') {
					yes=1;
					break;

				}
				if (yes) break;
			}	
			if (yes) break;
		}
		if (!yes) return 1;
	}
	P.reverse();
	if (P.a + x <= n && P.b + y <= m) {
		bool yes=0;
		for (int i=0; i < P.a; i++) {
			for (int j=0; j < P.b; j++) {
				if (P.ch[i][j] != '.' && Z[i+x][j+y] != '.') {
					yes=1;
					break;

				}
				if (yes) break;
			}	
			if (yes) break;
		}
		if (!yes) return 1;
	}
	return 0;
}

void _set(int x,int y, PENTO P) {
	for (int i=0; i < P.a; i++)
		for (int j=0; j < P.b; j++)
			if (P.ch[i][j] != '.') Z[x+i][y+j]=P.ch[i][j];
}

void del(int x,int y, PENTO P) {
	for (int i=0; i < P.a; i++)
		for (int j=0; j < P.b; j++)
			Z[x+i][y+j]='.';
}

bool check() {
	for (int i=0; i < n; i++)
		for (int j=0; j < m; j++)
			if (Z[i][j]== '.') return 0;
	return 1;
}
int ans=0;

void rotate() {
	char tmp[11][11];
	for (int i=0; i < n; i++)
		for (int j=0; j < m/2; j++)
			swap(Z[i][j],Z[i][m-j-1]);
	for (int i=0; i < n; i++)
		for (int j=0; j < m; j++)
			tmp[i][j]=Z[i][j];
	for (int i=0; i < n; i++)
		for (int j=0; j < m; j++)
			Z[j][i]=tmp[i][j];
	swap(n,m);
}

int absent() {
	FIZMAT_4EVER();
	string s="";
	for (int i=0; i < n; i++)
		for (int j=0; j < m; j++)
			s+=Z[i][j];

        if (S.find(s) == S.end()) { S.insert(s); return 1; }
        return 0;
}



void rec() {
	FIZMAT_4EVER();
	for (int i=0; i < n; i++)
		for (int j=0; j < m; j++)
			for (int t=0; t < k; t++) {
				if (_check(i,j,a[t]) == 1) {
					PENTO val=a[t];
					a[t].used=1;
					_set(i,j,val);
					FIZMAT_4EVER();
					if (check() == 1 && absent() == 1) {
						ans++;
						if (n==m) {
							rotate();
							if (check() == 1 && absent() == 1) ans++;
							rotate();
							if (check() == 1 && absent() == 1) ans++;
							rotate();
							if (check() == 1 && absent() == 1) ans++;
						} else {
							rotate();
							rotate();
							if (check() == 1 && absent() == 1) ans++;
						}
						if (ans > 10000) {
							printf("TOO MANY\n");
							exit(0);
						} 
					} else
					rec();
					a[t].used=0;
					del(i,j,val);
				}
			}	

}

int main() {
	freopen("pento.in","r",stdin);
	freopen("pento.out","w",stdout);
	memset(Z,'.',sizeof(Z));
	cin >> n >> m >> k;
	for (int i=0; i < k; i++)
		a[i].read();
	rec();
	printf("%d\n",ans);
	return 0;
}
