#include <bits/stdc++.h>
using namespace std;
long long cost[1002][1002];
pair<long long, int> best[1002 * 1002];
char used[1002][1002];
int n, m, a, b, len, in[1002][1002], val[1002][1002];
vector<pair<int, long long> > ans;
map<int, int> s;
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m >> a >> b;
  for (int i = 0; i < n; ++i) {
    s.clear();
    for (int j = 0; j < m; ++j) {
      if (j) cost[i][j] = cost[i][j - 1];
      if (j >= b) {
        cost[i][j] -= in[i][j - b];
        s[in[i][j - b]]--;
        if (s[in[i][j - b]] <= 0) s.erase(in[i][j - b]);
      }
      cin >> in[i][j];
      cost[i][j] += in[i][j];
      ++s[in[i][j]];
      val[i][j] = s.begin()->first;
    }
  }
  for (int j = 0; j < m; ++j) {
    long long sum = 0;
    s.clear();
    for (int i = 0; i < n; ++i) {
      sum += cost[n - i - 1][j];
      s[val[n - 1 - i][j]]++;
      if (i >= a - 1) {
        int idx = n - i + a - 2;
        long long tmp = cost[idx][j];
        cost[idx][j] = sum;
        sum -= tmp;
        tmp = s.begin()->first;
        s[val[idx][j]]--;
        if (!s[val[idx][j]]) s.erase(val[idx][j]);
        val[idx][j] = tmp;
      }
    }
  }
  for (int i = a - 1; i < n; ++i) {
    for (int j = b - 1; j < m; ++j)
      best[len++] = make_pair(cost[i][j] - val[i][j] * 1ll * a * b,
                              (i - a + 1) * m + j - b + 1);
  }
  sort(best, best + len);
  for (int i = 0; i < len; ++i) {
    int r = best[i].second / m;
    int c = best[i].second % m;
    if (!used[r][c]) {
      ans.push_back(make_pair(r * m + c, best[i].first));
      for (int j = -a + 1; j < a; ++j) {
        for (int k = -b + 1; k < b; ++k)
          if (j + r >= 0 && j + r < n && k + c >= 0 && k + c < m)
            used[j + r][k + c] = 1;
      }
    }
  }
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); ++i)
    printf("%d %d %I64d\n", ans[i].first / m + 1, ans[i].first % m + 1,
           ans[i].second);
  return 0;
}
