#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <set>
using namespace std;

constexpr int LIM = 32;

vector<vector<int>> box[LIM];


bool valid(vector<vector<int>> a0,vector<vector<int>> a1,vector<vector<int>> b0,vector<vector<int>> b1){
    for(int x=0;x<4;x++){
        for(int y=0;y<4;y++){
            if(a0[x][y] and b0[x][y]) return false;
        }
    }
    for(int x=0;x<4;x++){
        for(int y=0;y<4;y++){
            if(a1[x][y] and b1[x][y]) return false;
        }
    }
    return true;
}

void solve(int H,int N){
    for(int i=0;i<H;i++){
        string s[2]; cin >> s[0] >> s[1];
        for(int x=0;x<2;x++) for(int y=0;y<2;y++){
            if(s[x][y] == '#'){
                box[i][x+1][y+1] = 1;
            }
        }
    }

    int ans = 0;

    vector<vector<vector<vector<int>>>> boxes_t(N,vector<vector<vector<int>>>(4,vector<vector<int>>(4,vector<int>(4,0))));
    for(int i=0;i<N;i++){// i - th
        for(int j=0;j<2;j++){   // high
            string s[2]; cin >> s[0] >> s[1];
            //cerr << s[0] << " " << s[1] << endl;
            for(int x=0;x<2;x++){
                for(int y=0;y<2;y++){
                    if(s[x][y] == '#'){
                        //cerr << "NG " << i <<" " << j <<"  " << x << " " << y << endl;
                        boxes_t[i][j][x+1][y+1] = 1;
                    }
                }
            }
        }
    }

    for(int mask=0;mask<(1<<(4*N));mask++){
        //cerr << "mask " << mask << endl;
        int ans_cnt = 0;
        vector<vector<int>> tmp[LIM];
        for(int k=0;k<LIM;k++) tmp[k] = box[k];

        auto boxes = boxes_t;

        for(int idx=0;idx<N;idx++){
            int i = ((mask >> (idx*4)) % (1<<4)) / 4-1;
            int j = ((mask >> (idx*4)) % (1<<4)) % 4-1;
            if(i<-1 or i>1 or j<-1 or j>1) break;

            for(int h=0;h<2;h++){
                for(int x=0;x<4;x++){
                    for(int y=0;y<4;y++){
                        if(x+i>=0 and y+j>=0  and x+i<4 and y+j < 4) boxes[idx][h][x][y] = boxes_t[idx][h][x+i][y+j];
                        else  boxes[idx][h][x][y] = 0;
                    }
                }
            }

            //for(int x=0;x<4;x++){
            //    for(int y=0;y<4;y++){
            //        cerr << boxes[0][1][x][y];
            //    }
            //    cerr << endl;
            //}

            bool oktable = true;
            for(int h=0;h<2;h++){
                for(int x=0;x<4;x++){
                    for(int y=0;y<4;y++){
                        if((x == 0 or x == 3 or y == 0 or y == 3) and boxes[idx][h][x][y]){
                            oktable = false;
                            break;
                        }
                    }
                }
            }

            if(!oktable) break;
            // OK

            int okh;
            int limit = 0;
            int po = 0;
            for(int x=0;x<4;x++) for(int y=0;y<4;y++) if(boxes[idx][0][x][y]) po++;
            if(po == 0) limit = -1;
            ////cerr << "limit " << limit << endl;
            for(okh = LIM-2; okh>=0; okh--){
                if(!valid(tmp[okh],tmp[okh+1],boxes[idx][0],boxes[idx][1])){
                    break;
                }
            }
            okh++;

            //if (okh == 0) {
            //    cout << idx << " " << i << " " << j << endl;
            //}

            if(okh == 0 and limit == -1){
                bool ok = true;
                for(int x=0;x<4;x++){
                    for(int y=0;y<4;y++){
                        if(tmp[0][x][y] and boxes[idx][1][x][y]){
                            ok = false;
                            break;
                        }
                    }
                }
                if(ok){
                    okh = -1;
                }
            }

            for(int h=0;h<2;h++){
                for(int x=0;x<4;x++){
                    for(int y=0;y<4;y++){
                        if(okh+h>=0) tmp[okh+h][x][y] |= boxes[idx][h][x][y];
                    }
                }
            }

            set<int> del;
            for(int i=0;i<LIM;i++){
                int cnt = 0;
                for(int x=0;x<4;x++){
                    for(int y=0;y<4;y++){
                        if(tmp[i][x][y]){
                            cnt++;
                        }
                    }
                }
                if(cnt == 4){
                    del.insert(i);
                }
            }

            ans_cnt += del.size();

            if(del.size() == 1){
                int d = *del.begin();
                for(int i=0;i<LIM;i++){
                    if(i>=d){
                        if(i+1<LIM)tmp[i] = tmp[i+1];
                        else{
                            for(int x=0;x<4;x++) for(int y=0;y<4;y++) tmp[i][x][y]=0;
                        }
                    }
                }
            }else if(del.size() == 2){
                int d = *del.begin();
                for(int i=0;i<LIM;i++){
                    if(i>=d){
                        if(i+2<LIM) tmp[i] = tmp[i+2];
                        else{
                            for(int x=0;x<4;x++) for(int y=0;y<4;y++) tmp[i][x][y]=0;
                        }
                    }
                }
            }

                // for(int h=0;h<2;h++){
                //     for(int x=0;x<4;x++){
                //         for(int y=0;y<4;y++){
                //             cerr << tmp[h][x][y];
                //         }
                //         cerr << endl;
                //     }
                //     cerr << endl;
                // }

        }

        ans = max(ans,ans_cnt);
    }
    cout << ans << endl;
}


int main(){
    for(int i=0;i<LIM;i++){
        box[i] = vector<vector<int>>(4,vector<int>(4,0));
    }

    while(1){
        int h,n;
        cin >> h >> n;
        if(h == 0 and n == 0) break;
        for(int i=0;i<4;i++) for(int j=0;j<4;j++) for(int k=0;k<LIM;k++) box[k][i][j] = 0;
        solve(h,n);
    }
}



Measured memory_bytes: 3260