#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 10;
long long n, m, a, b;
long long arr[maxn][maxn];
long long sum[maxn][maxn];
long long Min[maxn][maxn];
set<pair<long long, pair<long long, long long> > > s;
multiset<long long> s_;
long long minr[maxn][maxn];
long long ground[maxn][maxn];
vector<pair<long long, pair<long long, long long> > > ans;
inline long long find_sum(pair<long long, long long> fi,
                          pair<long long, long long> se) {
  long long ret = sum[fi.first][fi.second];
  ret += sum[se.first + 1][se.second + 1];
  ret -= sum[se.first + 1][fi.second];
  ret -= sum[fi.first][se.second + 1];
  return ret;
}
inline void make_sum() {
  for (int i = n; i >= 1; --i)
    for (int j = m; j >= 1; --j)
      sum[i][j] = sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1] + arr[i][j];
}
inline void update_minr() {
  for (int i = 1; i <= n; ++i) {
    s_.clear();
    for (int j = 1; j <= b; ++j) s_.insert(arr[i][j]);
    for (int j = 1; j <= m - b + 1; ++j) {
      long long mini = *s_.begin();
      minr[i][j] = mini;
      s_.erase(s_.find(arr[i][j]));
      s_.insert(arr[i][j + b]);
    }
  }
}
inline void make_Min() {
  update_minr();
  for (int j = 1; j <= m - b + 1; ++j) {
    s_.clear();
    for (int i = 1; i <= a; ++i) s_.insert(minr[i][j]);
    for (int i = 1; i <= n - a + 1; ++i) {
      long long mini = *s_.begin();
      Min[i][j] = mini;
      s_.erase(s_.find(minr[i][j]));
      s_.insert(minr[i + a][j]);
    }
  }
}
vector<pair<long long, pair<long long, long long> > > v;
int vis[maxn][maxn];
inline void remove(long long r, long long c) {
  for (int i = r; i <= r + a - 1; ++i)
    for (int j = c; j <= c + b - 1; ++j) vis[i][j] = 1;
  for (int i = r - 1; i >= 1 && i >= r - a + 1; --i)
    for (int j = c; j <= c + b - 1; ++j) vis[i][j] = 1;
  for (int i = r; i <= r + a - 1; ++i)
    for (int j = c - 1; j >= 1 && j >= c - b + 1; --j) vis[i][j] = 1;
  for (int i = r - 1; i >= 1 && i >= r - a + 1; --i)
    for (int j = c - 1; j >= 1 && j >= c - b + 1; --j) vis[i][j] = 1;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m >> a >> b;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) cin >> arr[i][j];
  make_sum();
  make_Min();
  for (int i = 1; i <= n - a + 1; ++i)
    for (int j = 1; j <= m - b + 1; ++j)
      ground[i][j] =
          find_sum(pair<long long, long long>(i, j),
                   pair<long long, long long>(i + a - 1, j + b - 1)) -
          (a * b * Min[i][j]);
  v.clear();
  for (int i = 1; i <= n - a + 1; ++i)
    for (int j = 1; j <= m - b + 1; ++j)
      v.push_back(pair<long long, pair<long long, long long> >(
          ground[i][j], pair<long long, long long>(i, j)));
  sort(v.begin(), v.end());
  for (int i = 0; i < v.size(); ++i)
    if (vis[v[i].second.first][v[i].second.second] == 0) {
      long long X, Y;
      X = v[i].second.first;
      Y = v[i].second.second;
      ans.push_back(pair<long long, pair<long long, long long> >(
          ground[X][Y], pair<long long, long long>(X, Y)));
      remove(X, Y);
    }
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); ++i)
    cout << ans[i].second.first << " " << ans[i].second.second << " "
         << ans[i].first << endl;
  return 0;
}
