#include <bits/stdc++.h>
using namespace std;
const int N = 1100;
char str[N];
int G[N][N];
int sum_r[N], sum_c[N];
int n, m;
bool vis[N][N];
bool no() {
  int r0 = n, c0 = m;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      sum_r[i] += G[i][j];
    }
    if (sum_r[i]) r0--;
  }
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
      sum_c[j] += G[i][j];
    }
    if (sum_c[j]) c0--;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (G[i][j]) {
        int k = j;
        while (k <= m && G[i][k]) k++;
        if (k - j != sum_r[i]) return true;
        break;
      }
    }
  }
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
      if (G[i][j]) {
        int k = i;
        while (k <= n && G[k][j]) k++;
        if (k - i != sum_c[j]) return true;
        break;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (sum_r[i] == 0) {
      if (c0 == 0) return true;
    }
  }
  for (int j = 1; j <= m; j++) {
    if (sum_c[j] == 0) {
      if (r0 == 0) return true;
    }
  }
  return false;
}
vector<pair<int, int> > dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void dfs(int x, int y) {
  vis[x][y] = 1;
  for (auto [dx, dy] : dir) {
    int nx = x + dx, ny = y + dy;
    if (vis[nx][ny]) continue;
    if (G[nx][ny] && 0 < nx && nx <= n && 0 < ny && ny <= m) dfs(nx, ny);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%s", str + 1);
    for (int j = 1; j <= m; j++) {
      G[i][j] = str[j] == '#' ? 1 : 0;
    }
  }
  if (no()) {
    puts("-1");
    return 0;
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (G[i][j] && !vis[i][j]) {
        dfs(i, j);
        ans++;
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
