#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 7;
long long n, m;
char g[1006][1006];
bool vis[1006][1006];
bool c[1006], r[1006];
int fix[4][2] = {1, 0, 0, 1, 0, -1, -1, 0};
bool ju(int x, int y) {
  if (x < 0 || y < 0 || x >= n || y >= m || vis[x][y] == true || g[x][y] != '#')
    return false;
  return true;
}
void bfs(int x, int y) {
  pair<int, int> p, tmp;
  p = {x, y};
  queue<pair<int, int>> que;
  que.push(p);
  vis[x][y] = 1;
  while (!que.empty()) {
    tmp = que.front();
    que.pop();
    for (int i = 0; i < 4; i++) {
      int fx = tmp.first + fix[i][0];
      int fy = tmp.second + fix[i][1];
      if (ju(fx, fy)) {
        p = {fx, fy};
        vis[fx][fy] = 1;
        que.push(p);
      }
    }
  }
}
int main() {
  scanf("%lld %lld", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", g[i]);
  int f = 0, f1 = 0;
  for (int i = 0; i < n; i++) {
    int f2 = 0;
    for (int j = 0; j < m; j++) {
      if (g[i][j] == '#') {
        if (f2 == 0)
          f2 = 1;
        else if (f2 && g[i][j - 1] == '.') {
          puts("-1");
          return 0;
        }
      }
    }
    if (f2 == 0) f = 1;
  }
  for (int j = 0; j < m; j++) {
    int f2 = 0;
    for (int i = 0; i < n; i++) {
      if (g[i][j] == '#') {
        if (f2 == 0)
          f2 = 1;
        else if (f2 && g[i - 1][j] == '.') {
          puts("-1");
          return 0;
        }
      }
    }
    if (f2 == 0) f1 = 1;
  }
  if (f + f1 == 1) {
    puts("-1");
    return 0;
  }
  int cot = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (g[i][j] == '#' && vis[i][j] == false) {
        bfs(i, j);
        cot++;
      }
    }
  }
  printf("%d\n", cot);
  return 0;
}
