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

class UnionFind{
    vector<int> par;
    vector<int> rank;
    public:
    UnionFind(int n):rank(n),par(n){
        iota(par.begin(),par.end(),0);
    }
    int find(int x){
        if(par[x]==x) return x;
        else return par[x]=find(par[x]);
    }
    void unite(int x,int y){
        x=find(x),y=find(y);
        if(rank[x]<rank[y]) par[x]=y;
        else{
            if(rank[x]==rank[y]) rank[x]++;
            par[y]=x;
        }
    }
    bool isSame(int x,int y){
        return find(x)==find(y);
    }
};
int main(){
    int h,w;
    cin>>h>>w;
    vector<string> c(h);
    for(int i=0;i<h;i++) cin>>c[i];
    
    vector<int> vec;
    for(int bit=0;bit<(1<<w);bit++){
        bool isok=true;
        for(int i=0;i+1<w;i++){
            isok = isok && (((bit>>i)&1) || ((bit>>(i+1))&1));
        }
        if(isok) vec.push_back(bit);
    }
    auto isValid=[&](int bit,int row){
        bool isok=true;
        for(int i=0;i<w;i++){
            if(c[row][i]=='#'){
                isok= isok && ((bit>>i)&1);
            }
            else if(c[row][i]=='.'){
                isok= isok && (!((bit>>i)&1));
            }
        }
        return isok;
    };
    map<vector<int>,int> dp;
    map<vector<int>,int> dpX;
    for(auto bit:vec){
        if(!isValid(bit,0)) continue;
        vector<int> st(w);
        int idx=1;
        for(int i=0;i<w;i++){
            if((bit>>i)&1){
                for(;i<w;i++){
                    if(!((bit>>i)&1)) break;
                    st[i]=idx;
                }
                idx++;
            }
        }

        dp[st]=__builtin_popcount(bit);
    }
    dpX=dp;
    for(int i=1;i<h;i++){
        if(i+1==h) dpX=dp;
        map<vector<int>,int> next;
        for(auto bit:vec){
            if(!isValid(bit,i)) continue;
            for(auto &e:dp){
                vector<int> st=e.first;
                int cnt=e.second;
                bool isok=true;
                int v=*max_element(st.begin(),st.end());
                vector<int> hasChil(v);
                for(int i=0;i<w;i++){
                    isok = isok && !(st[i]==0 && ((bit>>i)&1)==0);
                    if(st[i]!=0){
                        hasChil[st[i]-1]=true;
                    }
                }
                if(accumulate(hasChil.begin(),hasChil.end(),0)!=v) continue;
                UnionFind u(v+w);
                for(int i=0;i<w;i++){
                    if(!((bit>>i)&1)) continue;
                    if(st[i]!=0){
                        if(u.isSame(st[i]-1,v+i)){
                            isok=false;
                            break; 
                        }
                        u.unite(st[i]-1,v+i);
                    }
                    if(((bit>>(i+1))&1)){
                        u.unite(v+i,v+i+1);
                    }
                }
                if(!isok) continue;
                for(int i=0;i<v;i++){
                    for(int j=0;j<=w;j++){
                        if(j==w){
                            isok=false;
                            break;
                        }
                        if(u.isSame(i,v+j)) break;
                    }
                }
                if(!isok) continue;
                int idx=1;
                vector<int> to(w);
                
                for(int i=0;i<w;i++){
                    if(!((bit>>i)&1)) continue;
                    for(int j=0;j<i;j++){
                        if(u.isSame(v+i,v+j)){
                            to[i]=to[j];
                            break;
                        }
                    }
                    if(to[i]==0) to[i]=idx++;
                }
                next[to]=max(next[to],cnt+__builtin_popcount(bit));
            }
        }
        dp=next;
    }
    int res=-1;
    for(int i=0;i<=w;i++){
        if(i==w && w==1){
            for(auto &e:dpX){
                if(*max_element(e.first.begin(),e.first.end())>1) continue;;
                res=max(res,e.second);
            }       
            break;
        }
        if(i==w) break;
        if(c[h-1][i]=='#') break;
    }
    
    for(auto &e:dp){
        if(*max_element(e.first.begin(),e.first.end())>1) continue;;
        res=max(res,e.second);
    }
    cout<<res<<endl;
    return 0;
}


Measured memory_bytes: 4096