#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 4;
const int maxlog = 22;
const long long inf = 1e18;
const int mod = 1e9 + 7;
const long long base = 307;
int n, m, x, y;
long long num[maxn][maxn], pref_sum[maxn][maxn], sum[maxn][maxn],
    ans_sum[maxn][maxn];
long long mini[maxn][maxn], ans_min[maxn][maxn];
bool mark[maxn][maxn];
vector<pair<long long, pair<int, int> > > v;
vector<pair<pair<int, int>, long long> > ans;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout.precision(20);
  scanf("%d%d%d%d", &n, &m, &x, &y);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf("%I64d", &num[i][j]);
      pref_sum[i][j] = pref_sum[i][j - 1] + num[i][j];
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m - y + 1; j++) {
      sum[i][j] = pref_sum[i][j + y - 1] - pref_sum[i][j - 1];
      sum[i][j] += sum[i - 1][j];
    }
  }
  for (int i = 1; i <= n - x + 1; i++) {
    for (int j = 1; j <= m - y + 1; j++) {
      ans_sum[i][j] = sum[i + x - 1][j] - sum[i - 1][j];
    }
  }
  for (int i = 1; i <= n; i++) {
    multiset<long long> st;
    for (int j = m; j > m - y + 1; j--) st.insert(num[i][j]);
    for (int j = m - y + 1; j >= 1; j--) {
      st.insert(num[i][j]);
      mini[i][j] = *st.begin();
      st.erase(st.find(num[i][j + y - 1]));
    }
  }
  for (int j = 1; j <= m - y + 1; j++) {
    multiset<long long> st;
    for (int i = n; i > n - x + 1; i--) st.insert(mini[i][j]);
    for (int i = n - x + 1; i >= 1; i--) {
      st.insert(mini[i][j]);
      ans_min[i][j] = *st.begin();
      st.erase(st.find(mini[i + x - 1][j]));
    }
  }
  for (int i = 1; i <= n - x + 1; i++) {
    for (int j = 1; j <= m - y + 1; j++) {
      long long z = ans_sum[i][j] - ans_min[i][j] * (long long)x * (long long)y;
      v.push_back(make_pair(z, make_pair(i, j)));
    }
  }
  sort(v.begin(), v.end());
  for (int i = 0; i < v.size(); i++) {
    int a = v[i].second.first;
    int b = v[i].second.second;
    if (!mark[a][b] && !mark[a + x - 1][b] && !mark[a][b + y - 1] &&
        !mark[a + x - 1][b + y - 1]) {
      ans.push_back(make_pair(make_pair(a, b), v[i].first));
      for (int j = a; j <= a + x - 1; j++)
        for (int k = b; k <= b + y - 1; k++) mark[j][k] = true;
    }
  }
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d %I64d\n", ans[i].first.first, ans[i].first.second,
           ans[i].second);
  return 0;
}
