#include<bits/stdc++.h>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)

using namespace std;

int H,N,maxi;
char tmp_tower[100][2][2]; //[z][y][x]
char tower[100][2][2];
char tmp_block[10][2][2];
char block[10][2][2];


void printB(){
  rep(i,N) {
    cout << i << "-th cube" << endl;
    rep(z,2){
      rep(y,2){
        rep(x,2){
          cout << block[i*2+z][y][x];
        } puts("");
      }puts("");
    }puts("");
  }puts("");
}

void printH(){
  rep(z,H+5){
    rep(y,2) {
      rep(x,2){
        cout << tower[z][y][x];
      } puts("");
    }puts("");
  }puts("");
}


bool isV(int x,int y){
  return 0 <= x && x < 2 && 0 <= y && y < 2;
}

// and Set
bool isValid(int dx,int dy,int index){

  rep(i,2)rep(k,2) rep(l,2) block[index*2+i][k][l] = '.';
  // *2 surukoto
  int z = index * 2;
  rep(dz,2){
    int nz = z + dz;
    rep(y,2){
      int ny = y + dy;
      rep(x,2){
        int nx = x + dx;
        if( tmp_block[nz][y][x] == '#' ) {
          if( !isV(nx,ny) ) return false;
        } else continue;
        block[nz][ny][nx] = '#';
      }
    }
  }
  /*
  cout << "ok--- " << dx << "," << dy << endl;
  rep(i,N) {
    if( i != index ) continue;
    cout << i << "-th cube" << endl;
    rep(z,2){
      rep(y,2){
        rep(x,2){
          cout << block[i*2+z][y][x];
        } puts("");
      }puts("");
    }puts("");
  }puts("");
  */

  return true;
}

int getCost(){
  //cout << "getCost---" << endl;
  //printB();

  rep(i,50) rep(j,2) rep(k,2) tower[i][j][k] = '.';
  rep(i,H) rep(j,2) rep(k,2) tower[i][j][k] = tmp_tower[i][j][k];
  int ret = 0;
  rep(i,N){
    int cur_z = 30;
    //rep(z,2) rep(y,2) rep(x,2) tower[cur_z+z][y][x] = tmp_block[i*2+z][y][x];
    while( 1 ){
      --cur_z;
      bool touch = false;
      rep(z,2) rep(y,2) rep(x,2) {
        int nz = cur_z + z;
        if( touch ) goto Skip;
        if( block[i*2+z][y][x] == '#' && nz-1 < 0 ) {
          touch = true; goto Skip;
        }
        if( nz-1 >=0&& block[i*2+z][y][x] == '#' && tower[nz-1][y][x] == '#' ) {
          touch = true; goto Skip;
        }
      }
    Skip:;
      if( touch ) break;
    }
    //cout << "put " << i << "-th cube to " << cur_z << endl;
    rep(z,2) rep(y,2) rep(x,2) {
      //tower[cur_z+z][y][x] = block[i*2+z][y][x];

      if( tower[cur_z+z][y][x] == '#' ||
          block[i*2+z][y][x] == '#' ) {
        assert( !( tower[cur_z+z][y][x] == '#' && block[i*2+z][y][x] == '#') );
        tower[cur_z+z][y][x] = '#';
      } else {
        tower[cur_z+z][y][x] = '.';
      }
    }
    //printH();
    bool erased = false;
    rep(z,2){
      bool success = true;
      rep(y,2) {
        rep(x,2) {
          if( tower[cur_z+z][y][x] != '#' ) {
            success = false;
            break;
          }
        }
        if( !success ) break;
      }
      if( success ) {
        ++ret;
        erased = true;
        rep(y,2) rep(x,2) tower[cur_z+z][y][x] = '.';
        rep(y,2) rep(x,2) {
          tower[cur_z+z][y][x] = tower[cur_z+z+1][y][x];
          tower[cur_z+z+1][y][x] = '.'; // ????
        }
      }
    }

    // --- ??????????????????????????????????¬???????----
    rep(z,2){
      bool success = true;
      rep(y,2) {
        rep(x,2) {
          if( tower[cur_z+z][y][x] != '#' ) {
            success = false;
            break;
          }
        }
        if( !success ) break;
      }
      if( success ) {
        ++ret;
        erased = true;
        rep(y,2) rep(x,2) tower[cur_z+z][y][x] = '.';
      }
    }
    // ------
    
    

  }
  //printH();
  return ret;
}

void dfs(int n){
  if( n >= N ) {
    int tmp = getCost();
    maxi = max(maxi,tmp);
    return;
  }
  REP(dx,-1,2){
    REP(dy,-1,2){
      if( !isValid(dx,dy,n) ) continue;
      //cout << "ok " << dx << "," << dy << endl;
      dfs(n+1);
    }
  }
}

void compute(){
  maxi = 0;
  dfs(0);
  cout << maxi << endl;
}

int main(){
  while( cin >> H >> N, H|N ){
    rep(i,100) rep(j,2) rep(k,2) tmp_tower[i][j][k] = tower[i][j][k] = '.';
    rep(i,10) rep(j,2) rep(k,2) tmp_block[i][j][k] = block[i][j][k] = '.';
    rep(z,H) {
      rep(y,2){
        string s;
        cin >> s;
        rep(x,2) tmp_tower[z][y][x] = s[x];
      }
    }
    rep(z,N*2){
      rep(y,2) {
        string s;
        cin >> s;
        rep(x,2) tmp_block[z][y][x] = s[x];
      }
    }
    compute();
  }
  return 0;
}

Measured memory_bytes: 1208