#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1024;
bool mark[MAXN][MAXN];
int a[MAXN][MAXN], b[MAXN][MAXN];
long long s[MAXN][MAXN];
int main() {
  int n, m, r, c;
  vector<pair<long long, pair<int, int> > > v, w;
  scanf("%d%d%d%d", &n, &m, &r, &c);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      scanf("%d", &a[i][j]);
      s[i][j] = a[i][j];
    }
  }
  for (int i = 1; i <= n; ++i) {
    copy(a[i], a[i] + m + 1, s[i]);
    partial_sum(s[i], s[i] + m + 1, s[i]);
    for (int j = 1; j <= m; ++j) {
      s[i][j] += s[i - 1][j];
    }
  }
  for (int i = 1; i <= n; ++i) {
    multiset<int> st;
    for (int j = 1; j <= m; ++j) {
      if (j > c) {
        st.erase(st.find(a[i][j - c]));
      }
      st.insert(a[i][j]);
      b[i][j] = *st.begin();
    }
  }
  for (int j = 1; j <= m; ++j) {
    multiset<int> st;
    for (int i = 1; i <= n; ++i) {
      if (i > r) {
        st.erase(st.find(b[i - r][j]));
      }
      st.insert(b[i][j]);
      a[i][j] = *st.begin();
    }
  }
  for (int i = r; i <= n; ++i) {
    for (int j = c; j <= m; ++j) {
      v.push_back(make_pair(s[i][j] - s[i - r][j] - s[i][j - c] +
                                s[i - r][j - c] - r * c * (long long)a[i][j],
                            make_pair(i, j)));
    }
  }
  sort(v.begin(), v.end());
  for (int k = 0; k < (int)v.size(); ++k) {
    int x = v[k].second.first;
    int y = v[k].second.second;
    if (mark[x][y]) {
      continue;
    }
    w.push_back(v[k]);
    for (int i = x - r + 1; i < x + r && i <= n; ++i) {
      fill(mark[i] + y - c + 1, mark[i] + min(y + c, m + 1), true);
    }
  }
  printf("%d\n", (int)w.size());
  for (int k = 0; k < (int)w.size(); ++k) {
    printf("%d %d %I64d\n", w[k].second.first - r + 1,
           w[k].second.second - c + 1, w[k].first);
  }
  return 0;
}
