#include<bits/stdc++.h>
using namespace std;
#define N 2005
char s[N][N];
int n,m,vis[N][N],ans,f1[N],f2[N];
void dfs(int i,int j){
vis[i][j]=1;
if(i+1<=n && s[i+1][j]=='#' && !vis[i+1][j])
dfs(i+1,j);
if(j-1>=1 && s[i][j-1]=='#' && !vis[i][j-1])
dfs(i,j-1);
if(i-1>=1 && s[i-1][j]=='#' && !vis[i-1][j])
dfs(i-1,j);
if(j+1<=m && s[i][j+1]=='#' && !vis[i][j+1])
dfs(i,j+1);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
int ff=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(s[i][j]=='#')ff=1;
}
if(!ff){
cout<<0<<'\n';
return 0;
}
//所有同行同列的#必须挨在一起
for(int i=1;i<=n;i++){
int L=m+1,R=0;
for(int j=1;j<=m;j++)
if(s[i][j]=='#')R=j;
for(int j=m;j>=1;j--)
if(s[i][j]=='#')L=j;
for(int j=L;j<=R;j++)
if(s[i][j]=='.'){
puts("-1");return 0;
}
}
for(int j=1;j<=m;j++){
int U=n+1,D=0;
for(int i=1;i<=n;i++)
if(s[i][j]=='#')D=i;
for(int i=n;i>=1;i--)
if(s[i][j]=='#')U=i;
for(int i=U;i<=D;i++)
if(s[i][j]=='.'){
puts("-1");return 0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
if(s[i][j]=='#')f1[i]=1;
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++)
if(s[i][j]=='#')f2[j]=1;
}
int c1=0,c2=0;
for(int i=1;i<=n;i++)if(f1[i]==0)c1++;
for(int j=1;j<=m;j++)if(f2[j]==0)c2++;
if(c1&&!c2 || !c1&&c2){puts("-1");return 0;}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!vis[i][j] && s[i][j]=='#')++ans,dfs(i,j);
cout<<ans<<'\n';
}