#include <bits/stdc++.h>
using namespace std;
vector<pair<long long, long long>> st = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
vector<vector<bool>> s;
vector<vector<char>> a;
void DFS(long long x, long long y, long long n, long long m) {
  s[x][y] = false;
  for (pair<long long, long long> q : st) {
    if (-1 < x + q.first && x + q.first < n && -1 < y + q.second &&
        y + q.second < m && s[x + q.first][y + q.second] &&
        a[x + q.first][y + q.second] == '#') {
      DFS(x + q.first, y + q.second, n, m);
    }
  }
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  long long n, m;
  cin >> n >> m;
  a.assign(n, {}), s.assign(n, {});
  for (long long q = 0; q < n; q++) {
    a[q].assign(m, '0'), s[q].assign(m, true);
    for (long long q1 = 0; q1 < m; q1++) {
      cin >> a[q][q1];
    }
  }
  bool flag1 = false, flag2 = false;
  for (long long q = 0; q < n; q++) {
    long long q1 = 0;
    while (q1 < m && a[q][q1] == '.') {
      q1++;
    }
    if (q1 == m) {
      flag1 = true;
    }
    while (q1 < m && a[q][q1] == '#') {
      q1++;
    }
    while (q1 < m && a[q][q1] == '.') {
      q1++;
    }
    if (q1 != m) {
      cout << -1 << '\n';
      return 0;
    }
  }
  for (long long q1 = 0; q1 < m; q1++) {
    long long q = 0;
    while (q < n && a[q][q1] == '.') {
      q++;
    }
    if (q == n) {
      flag2 = true;
    }
    while (q < n && a[q][q1] == '#') {
      q++;
    }
    while (q < n && a[q][q1] == '.') {
      q++;
    }
    if (q != n) {
      cout << -1 << '\n';
      return 0;
    }
  }
  if (flag1 + flag2 == 1) {
    cout << -1 << '\n';
    return 0;
  }
  long long ans = 0;
  for (long long q = 0; q < n; q++) {
    for (long long q1 = 0; q1 < m; q1++) {
      if (s[q][q1] && a[q][q1] == '#') {
        DFS(q, q1, n, m), ans++;
      }
    }
  }
  cout << ans << '\n';
  return 0;
}
