#include <bits/stdc++.h>
using namespace std;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
const int MAXN = 1e3 + 40;
int n, m, ans;
char f[MAXN][MAXN];
bool flag = true;
bool Ah[MAXN][MAXN];
void dfs(int x, int y) {
  Ah[x][y] = 1;
  for (int i = 0; i < 4; i++) {
    int xx = x + dx[i], yy = y + dy[i];
    if (xx > 0 && yy > 0 && xx <= n && yy <= m && Ah[xx][yy] == 0 &&
        f[xx][yy] == '#')
      dfs(xx, yy);
  }
}
bool Hash[MAXN], flag2;
signed main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    bool ff = false;
    for (int j = 1; j <= m; j++) {
      cin >> f[i][j];
      if (f[i][j] == '#' && j > 0 && f[i][j - 1] != '#' && ff) flag = false;
      if (f[i][j] == '#') {
        Hash[j] = 1;
        ff = true;
      }
    }
    if (ff == false) flag2 = true;
  }
  if (flag2) {
    bool tt = true;
    for (int i = 1; i <= m; i++) {
      if (Hash[i] == 0) {
        tt = false;
        break;
      }
    }
    if (tt) {
      puts("-1");
      return 0;
    }
  }
  memset(Hash, 0, sizeof Hash);
  flag2 = false;
  for (int i = 1; i <= m; i++) {
    bool ff = false;
    for (int j = 1; j <= n; j++) {
      if (f[j][i] == '#' && j > 0 && f[j - 1][i] != '#' && ff) flag = false;
      if (f[j][i] == '#') {
        Hash[j] = 1;
        ff = true;
      }
    }
    if (ff == false) flag2 = true;
  }
  if (flag2) {
    bool tt = true;
    for (int i = 1; i <= n; i++) {
      if (Hash[i] == 0) {
        tt = false;
        break;
      }
    }
    if (tt) {
      puts("-1");
      return 0;
    }
  }
  if (!flag) {
    puts("-1");
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (!Ah[i][j] && f[i][j] == '#') {
        ans++;
        dfs(i, j);
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
