#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int n, m;
char a[maxn][maxn];
int vis[maxn][maxn];
void dfs(int x, int y) {
  vis[x][y] = 1;
  for (int i = 0; i < 4; i++) {
    for (int i = 0; i < 4; i++) {
      int nx = x + dir[i][0];
      int ny = y + dir[i][1];
      if (nx >= 0 && ny >= 0 && vis[nx][ny] == 0 && nx < n && ny < m &&
          a[nx][ny] == '#') {
        dfs(nx, ny);
      }
    }
  }
}
int main() {
  int flag1 = 0, flag2 = 0;
  cin >> n >> m;
  for (int i = 0; i < n; i++) scanf("%s", a[i]);
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    cnt = 0;
    for (int j = 0; j < m; j++) {
      if (a[i][j] == '#' && (j == 0 || a[i][j - 1] != '#')) cnt++;
    }
    if (cnt >= 2) {
      printf("-1\n");
      return 0;
    }
    if (cnt == 0) flag1 = 1;
  }
  for (int j = 0; j < m; j++) {
    cnt = 0;
    for (int i = 0; i < n; i++) {
      if (a[i][j] == '#' && (i == 0 || a[i - 1][j] != '#')) cnt++;
    }
    if (cnt >= 2) {
      printf("-1\n");
      return 0;
    }
    if (cnt == 0) flag2 = 1;
  }
  if (flag1 ^ flag2) {
    printf("-1\n");
    return 0;
  }
  int rst = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (a[i][j] == '#' && vis[i][j] == 0) {
        rst++;
        dfs(i, j);
      }
    }
  }
  printf("%d\n", rst);
}
