#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

char G[21][2][2];
char B[6][2][2];
char C[21][2][2];

const int dy[9] = { -1, -1, -1, 0, 0, 0, 1, 1, 1 };
const int dx[9] = { -1, 0, 1, -1, 0, 1, -1, 0, 1 };

int del;

bool put(int b, int s) {
  for(int y = 0; y < 2; ++y) {
    for(int x = 0; x < 2; ++x) {
      if((B[b][y][x] == '#' || B[b + 1][y][x] == '#') && (y + dy[s] < 0 || y + dy[s] >= 2 || x + dx[s] < 0 || x + dx[s] >= 2)) {
        return false;
      }
    }
  }
  // cerr << "i = " << (s + 1) << " can put" << endl;
  int minH = 19;
  for(int h = 19; h >= -1; --h) {
    bool ok = true;
    for(int y = 0; y < 2; ++y) {
      for(int x = 0; x < 2; ++x) {
        if(B[b][y][x] == '#' && C[h][y + dy[s]][x + dx[s]] == '#') {
          ok = false;
        }
        if(B[b + 1][y][x] == '#' && C[h + 1][y + dy[s]][x + dx[s]] == '#') {
          ok = false;
        }
      }
    }
    if(!ok) break;
    minH = h;
  }
  for(int y = 0; y < 2; ++y) {
    for(int x = 0; x < 2; ++x) {
      if(B[b][y][x] == '#') {
        C[minH][y + dy[s]][x + dx[s]] = B[b][y][x];
      }
      if(B[b+1][y][x] == '#') {
        C[minH + 1][y + dy[s]][x + dx[s]] = B[b+1][y][x];
      }
    }
  }
#if 0
  for(int h = 5; h >= 0; --h) {
    cerr << "h = " << h << endl;
    for(int y = 0; y < 2; ++y) {
      for(int x = 0; x < 2; ++x) {
        cerr << C[h][y][x];
      }
      cerr << endl;
    }
  }
#endif
  for(int h = 0; h < 20; ++h) {
    bool ok = true;
    for(int y = 0; y < 2; ++y) {
      for(int x = 0; x < 2; ++x) {
        if(C[h][y][x] == '.') {
          ok = false;
        }
      }
    }
    if(ok) {
      ++del;
      for(int y = 0; y < 2; ++y) {
        for(int x = 0; x < 2; ++x) {
          for(int h2 = h; h2 < 20; ++h2) {
            C[h2][y][x] = C[h2 + 1][y][x];
          }
        }
      }
      for(int y = 0; y < 2; ++y) {
        for(int x = 0; x < 2; ++x) {
          C[20][y][x] = '.';
        }
      }
      h--;
    }
  }
  return true;
}

int main() {
  ios::sync_with_stdio(false);
  while(true) {
    int H, N; cin >> H >> N;
    if(H == 0 && N == 0) break;
    memset(G, '.', sizeof(G));
    for(int h = 0; h < H; ++h) {
      for(int y = 0; y < 2; ++y) {
        string s; cin >> s;
        for(int x = 0; x < 2; ++x) {
          G[h][y][x] = s[x];
        }
      }
    }
    memset(B, '.', sizeof(B));
    for(int b = 0; b < 2 * N; ++b) {
      for(int y = 0; y < 2; ++y) {
        string s; cin >> s;
        for(int x = 0; x < 2; ++x) {
          B[b][y][x] = s[x];
        }
      }
    }
#if 0
    for(int h = H - 1; h >= 0; --h) {
      cerr << "h = " << h << endl;
      for(int y = 0; y < 2; ++y) {
        for(int x = 0; x < 2; ++x) {
          cerr << G[h][y][x];
        }
        cerr << endl;
      }
    }
    for(int h = 0; h < N; ++h) {
      cerr << "b = " << h << endl;
      for(int y = 0; y < 2; ++y) {
        for(int x = 0; x < 2; ++x) {
          cerr << B[2*h][y][x];
        }
        cerr << endl;
      }
      for(int y = 0; y < 2; ++y) {
        for(int x = 0; x < 2; ++x) {
          cerr << B[2*h + 1][y][x];
        }
        cerr << endl;
      }
    }
#endif
    int ans = 0;
#if 1
    for(int i = 0; i < 9; ++i) {
      for(int j = 0; j < 9; ++j) {
        for(int k = 0; k < 9; ++k) {
          del = 0;
          memcpy(C, G, sizeof(G));
          if(!put(0, i)) continue;
          if(!put(2, j)) continue;
          if(!put(4, k)) continue;
          ans = max(ans, del);
        }
      }
    }
#else
    for(int i = 0; i < 9; ++i) {
      del = 0;
      memcpy(C, G, sizeof(G));
      if(!put(0, i)) continue;
      ans = max(ans, del);
    }
#endif
    cout << ans << endl;
  }
}

Measured memory_bytes: 3224