#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using Pi = pair<int, int>;
using Pl = pair<ll, ll>;
using vint = vector<int>;
using vll = vector<ll>;
using uint = unsigned int;
using ull = unsigned long long;

template<typename T> using uset = unordered_set<T>;
template<typename T1, typename T2> using umap = unordered_map<T1, T2>;

constexpr int INF = (1 << 30) - 1;
constexpr ll LLINF = 1LL << 60;
constexpr int dy[] = {1, 0, -1, 0, 1, -1, -1, 1};
constexpr int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};
constexpr char el = '\n';
constexpr int mod = 1000000007;

template<typename T> T gcd(T a, T b) { return (b ? gcd(b, a % b) : a); }
template<typename T> T lcm(T a, T b) { return (a / gcd(a, b) * b); }
template<typename T1, typename T2> inline void chmin(T1 &a, T2 b) { if (a > b) a = b; }
template<typename T1, typename T2> inline void chmax(T1 &a, T2 b) { if (a < b) a = b; }

template<typename T>
ostream& operator <<(ostream &os, vector<T> &v) {
	for (auto &u : v) os << u << el;
	return (os);
}

template<typename T>
istream& operator >>(istream &is, vector<T> &v) {
	for (auto &u : v) is >> u;
	return (is);
}

template<typename T1, typename T2>
istream& operator >>(istream &is, pair<T1, T2> &p) {
	return (is >> p.first >> p.second);
}


int H, N;
vector<vector<string>> ope(3, vector<string>(2));
int ans;

int fall(vector<string> &S, vector<string> op) {
	int num = 0;
	for (int h = H+4; h >= -2; h--) {
		bool flag = true;
		if (h > -2) {
			for (int i = 0; i < 2; i++) {
				if (h != -1 || i > 0) {
					for (int j = 0; j < 4; j++) {
						flag &= (S[h+i][j] == '.' || op[i][j] == '.');
					}
				} else flag &= op[0] == "....";
			}
			if (flag) continue;
		}
		h++;
		for (int i = 0; i < 2; i++) {
			if (h != -1 || i > 0) {
				for (int j = 0; j < 4; j++) {
					if (S[h+i][j] == '.') S[h+i][j] = op[i][j];
				}
			}
		}
		for (int mh = max(0, h); mh < min(H+6, mh+2); mh++) {
			while (S[mh] == "####") { 
				S[mh] = "....";
				for (int i = mh+1; i < H+6; i++) S[i-1] = S[i];
				num++;
			}
		}
		break;
	}
	return (num);
}

void dfs(vector<string> S, int n, int num) {
	if (n == N) { chmax(ans, num); return; }
	int nnum = num;
	//通常
	vector<string> s1 = S;
	nnum = fall(s1, ope[n]);
	dfs(s1, n+1, nnum + num);

	//右
	vector<string> s2 = S;
	vector<string> op1 = ope[n];
	if (op1[0][1] == '.' && op1[0][3] == '.' && op1[1][1] == '.' && op1[1][3] == '.') {
		swap(op1[0][1], op1[0][0]);
		swap(op1[0][3], op1[0][2]);
		swap(op1[1][1], op1[1][0]);
		swap(op1[1][3], op1[1][2]);
	}
	nnum = fall(s2, op1);	
	dfs(s2, n+1, nnum + num);

	//下
	vector<string> s3 = S;
	vector<string> op2 = ope[n];
	if (op2[0][2] == '.' && op2[0][3] == '.' && op2[1][2] == '.' && op2[1][3] == '.') {
		swap(op2[0][2], op2[0][0]);
		swap(op2[0][3], op2[0][1]);
		swap(op2[1][2], op2[1][0]);
		swap(op2[1][3], op2[1][1]);
	}
	nnum = fall(s3, op2);	
	dfs(s3, n+1, nnum + num);

	//右下
	vector<string> s4 = S;
	if (op1[0][2] == '.' && op1[0][3] == '.' && op1[1][2] == '.' && op1[1][3] == '.') {
		swap(op1[0][2], op1[0][0]);
		swap(op1[0][3], op1[0][1]);
		swap(op1[1][2], op1[1][0]);
		swap(op1[1][3], op1[1][1]);
	}
	nnum = fall(s4, op1);	
	dfs(s4, n+1, nnum + num);
	return;	
}

bool solve() {
	cin >> H >> N;
	if (H == 0 && N == 0) return (false);
	vector<string> S(H+6, "....");
	for (int i = 0; i < H; i++) {
		string s, t;
		cin >> s >> t;
		S[i] = s + t;
	}
	for (int i = 0; i < N; i++) {
		string s1, t1, s2, t2;
		cin >> s1 >> t1 >> s2 >> t2;
		ope[i][0] = s1 + t1;
		ope[i][1] = s2 + t2;
		//opeを左上にずらす	
		//左
		if (s1[0] == '.' && t1[0] == '.' && s2[0] == '.' && t2[0] == '.') {
			swap(ope[i][0][0], ope[i][0][1]);
			swap(ope[i][0][2], ope[i][0][3]);
			swap(ope[i][1][0], ope[i][1][1]);
			swap(ope[i][1][2], ope[i][1][3]);
		}
		//上
		if (ope[i][0][0] == '.' && ope[i][0][1] == '.' &&
			ope[i][1][0] == '.' && ope[i][1][1] == '.') {
			swap(ope[i][0][0], ope[i][0][2]);
			swap(ope[i][0][1], ope[i][0][3]);
			swap(ope[i][1][0], ope[i][1][2]);
			swap(ope[i][1][1], ope[i][1][3]);
		}
	}
	ans = 0;
	dfs(S, 0, 0);
	cout << ans << endl;
	return (true);
}
int main() {
	while (solve());
	return (0);
}


Measured memory_bytes: 3172