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

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;

#define fi first
#define se second
#define repl(i,a,b) for(ll i=(ll)(a);i<(ll)(b);i++)
#define rep(i,n) repl(i,0,n)
#define each(itr,v) for(auto itr:v)
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout<<#x"="<<x<<endl
#define mmax(x,y) (x>y?x:y)
#define mmin(x,y) (x<y?x:y)
#define maxch(x,y) x=mmax(x,y)
#define minch(x,y) x=mmin(x,y)
#define uni(x) x.erase(unique(all(x)),x.end())
#define exist(x,y) (find(all(x),y)!=x.end())
#define bcnt __builtin_popcount

#define INF INT_MAX/3

int h;
int n;
int b[111][2][2],bl[5][2][2][2],tmp[5][111][2][2];
int dx[]={1,1,1,0,0,0,-1,-1,-1};
int dy[]={1,0,-1,1,0,-1,1,0,-1};

int dfs(int crt){
  if(crt==n)return 0;
  int res=0;
  memcpy(tmp[crt],b,sizeof(b));
  rep(dir,9){
    bool ok=true;
    rep(i,2)rep(j,2)rep(k,2){
      if(bl[crt][i][j][k]==1){
        int nj=j+dx[dir],nk=k+dy[dir];
        if(nj<0||nj>=2||nk<0||nk>=2)ok=false;
      }
    }
    if(ok){
      int minh=100;
      int cnt=0;
      for(int nh=100;nh>=-1;nh--){
        ok=true;
        rep(i,2)rep(j,2)rep(k,2){
          int nj=j+dx[dir],nk=k+dy[dir];
          if((nj>=0&&nj<2&&nk>=0&&nk<2&&nh+i>=0&&bl[crt][i][j][k]&&b[nh+i][nj][nk])||(bl[crt][i][j][k]&&nh+i<0))ok=false;
        }
        if(ok)minch(minh,nh);
        else break;
      }
      rep(i,2)rep(j,2)rep(k,2){
        int nj=j+dx[dir],nk=k+dy[dir];
        if(nj>=0&&nj<2&&nk>=0&&nk<2&&minh+i>=0&&bl[crt][i][j][k]){
          b[minh+i][nj][nk]=1;
        }
      }
      for(int nh=100;nh>=0;nh--){
        bool del=true;
        rep(j,2)rep(k,2){
          if(b[nh][j][k]==0)del=false;
        }
        if(del){
          cnt++;
          repl(i,nh,100)rep(j,2)rep(k,2){
            b[i][j][k]=b[i+1][j][k];
            b[i+1][j][k]=0;
          }
        }
      }
      maxch(res,dfs(crt+1)+cnt);
    }
    memcpy(b,tmp[crt],sizeof(b));
  }
  return res;
}

int main(){
	cin.sync_with_stdio(false);
  while(1){
    cin>>h>>n;
    if(h==0)break;
    memset(b,0,sizeof(b));
    rep(i,h)rep(j,2){
      string s;
      cin>>s;
      rep(k,2){
        b[i][j][k]=s[k]=='#';
      }
    }
    rep(i,n)rep(j,2)rep(k,2){
      string s;
      cin>>s;
      rep(l,2){
        bl[i][j][k][l]=s[l]=='#';
      }
    }
    cout<<dfs(0)<<endl;
  }
  return 0;
}