#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
#include<cassert>
#include<complex>
using namespace std;

//#define int long long
typedef long long ll;

typedef unsigned long long ul;
typedef unsigned int ui;
const ll mod = 998244353;
const ll INF = (1e+18)+7;
typedef pair<int, int>P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
#define all(v) (v).begin(),(v).end()
typedef pair<ll, ll> LP;
typedef long double ld;
typedef pair<ld, ld> LDP;
const ld eps = 1e-6;
const ld pi = acos(-1.0);
//typedef vector<vector<ll>> mat;
typedef vector<int> vec;

using mat = pair<LP, LP>;
void debug(vec &v) {
	int n = v.size();
	rep(i, n) {
		if (i > 0)cout << " ";
		cout << v[i];
	}
	cout << endl;
}
void debug(mat &m) {
	cout << m.first.first << " " << m.first.second << endl;
	cout << m.second.first << " " << m.second.second << endl;
}

ll mod_pow(ll a, ll n) {
	ll res = 1;
	while (n) {
		if (n & 1)res = res * a%mod;
		a = a * a%mod; n >>= 1;
	}
	return res;
}

int h, n;
void solve() {
	vector<vector<bool>> b(h);
	rep(i, h) {
		rep(j, 4) {
			char t; cin >> t;
			b[i].push_back(t == '#');
		}
	}
	vector<vector<bool>> v[3];
	rep(i, n) {
		v[i].resize(2);
		rep(j, 2)rep(k, 4) {
			char t; cin >> t;
			v[i][j].push_back(t == '#');
		}
	}
	int ans = 0;
	function<void(int,vector<vector<bool>>,int)> dfs = [&](int id,vector<vector<bool>> r,int sum) {
		if (id == n) {
			/*int tmp = 0;
			rep(i, r.size()) {
				int cnt = 0;
				rep(j, 4) {
					cnt += (r[i][j]);
				}
				if (cnt == 4)tmp++;
			}*/
			ans = max(ans, sum); return;
		}
		for (int i = -1; i <= 1; i++) {
			for (int j = -1; j <= 1; j++) {
				vector<vector<bool>> ad(2);
				rep(k, 2)ad[k].resize(4,false);
				bool valid = true;
				rep(k, 4){
					rep(l, 2) {
						if (v[id][l][k] == 1) {
							int x = k % 2, y = k / 2;
							x += i; y += j;
							if (x < 0 || x == 2 || y < 0 || y == 2)valid = false;
							else ad[l][x + y * 2] = true;
						}
					}
				}
				if (!valid)continue;
				int len = r.size();
				for (int z = -1; z <= len; z++) {
					vector<vector<bool>> cop = r;
					if (z >= len - 1) {
						cop.push_back({ 0,0,0,0 });
					}
					if (z == len) {
						cop.push_back({ 0,0,0,0 });
					}
					valid = true;
					rep(k, 2)rep(l, 4) {
						if (ad[k][l]) {
							int hei = k + z;
							if (hei < 0) {
								valid = false; continue;
							}
							for (int z = max(hei,0); z < len; z++) {
								if (cop[z][l])valid = false;
							}
							if (valid)cop[hei][l] = true;
						}
					}
					if (valid) {
						int nsum = sum;
						rep(i, cop.size()) {
							int cnt = 0;
							rep(j, 4)if (cop[i][j])cnt++;
							if (cnt == 4) {
								nsum++;
								cop.erase(cop.begin() + i);
								i--;
							}
						}
						dfs(id + 1, cop,nsum); break;
					}
				}
			/*	if (len >= 2) {
					vector<vector<bool>> cop = r;
					rep(k, 2)rep(l, 4) {
						if (ad[k][l]) {
							if (cop[len - 2 + k][l])valid = false;
							else if (cop[len - 1][l])valid = false;
							else cop[len - 2 + k][l] = true;
						}
					}
					if (valid) {
						dfs(id + 1, cop); continue;
					}
				}
				else {
					vector<vector<bool>> cop = r;
					int cnt = 0;
					rep(k, 4)if (ad[0][k])cnt++;
					if (cnt == 0) {
						rep(l, 4) {
							if (ad[1][l]) {
								if (cop[0][l])valid = false;
								else cop[0][l] = true;
							}
						}
					}
					if (valid) {
						dfs(id + 1, cop); continue;
					}
				}
				valid = true;
				vector<vector<bool>> cop = r;
				cop.push_back({ 0,0,0,0 });
				rep(k, 2)rep(l, 4) {
					if (ad[k][l]) {
						if (cop[len - 1 + k][l])valid = false;
						else cop[len - 1 + k][l] = true;
					}
				}
				if (valid) {
					dfs(id + 1, cop); continue;
				}
				valid = true;
				cop = r;
				cop.push_back({ 0,0,0,0 });
				cop.push_back({ 0,0,0,0 });
				rep(k, 2)rep(l, 4) {
					cop[len + k][l] = ad[k][l];
				}
				dfs(id + 1, cop);*/
			}
		}
	};
	dfs(0, b,0);
	//cout << "ans is ";
	cout << ans << endl;
}


signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//cout << fixed << setprecision(17);
	//init();
	//int t; cin >> t; rep(i, t)solve();
	while (cin>>h>>n,h) {
		solve();
	}
	//stop
		return 0;
}



Measured memory_bytes: 3192