#include <bits/stdc++.h>
using namespace std;
const long long int mod = 1e9 + 7;
template <class C>
void setmin(C &a, C b) {
  if (a > b) a = b;
}
template <class C>
void setmax(C &a, C b) {
  if (a < b) a = b;
}
template <class C>
long long int mult(C a, C b) {
  return ((a % mod) * (b % mod)) % mod;
}
template <class C>
long long int addmod(C a, C b) {
  return (a % mod + b % mod) % mod;
}
const long long int MAX = 1e6;
void solve() {
  long long int n, m;
  cin >> n >> m;
  vector<vector<long long int> > fst(n, vector<long long int>(m)),
      snd(n, vector<long long int>(m, 0));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) cin >> fst[i][j];
  long long int cnt = 0;
  vector<pair<long long int, long long int> > vec;
  for (int i = 0; i < (n - 1); i++)
    for (int j = 0; j < (m - 1); j++)
      if (fst[i][j] == 1 && fst[i][j + 1] == 1 && fst[i + 1][j] == 1 &&
          fst[i + 1][j + 1] == 1) {
        snd[i][j] = 1;
        snd[i][j + 1] = 1;
        snd[i + 1][j] = 1;
        snd[i + 1][j + 1] = 1;
        ++cnt;
        vec.push_back({i, j});
      }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (fst[i][j] != snd[i][j]) {
        cout << -1;
        return;
      }
  cout << cnt << '\n';
  for (int i = 0; i < vec.size(); i++)
    cout << vec[i].first + 1 << " " << vec[i].second + 1 << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ;
  long long int t;
  t = 1;
  while (t--) solve();
  return 0;
}
