#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100100;
int n, m, k, A[MAXN][5], ans[5];
void add(deque<int> &d, int v) {
  while (((int)d.size()) && d.back() < v) d.pop_back();
  d.push_back(v);
}
void remove(deque<int> &d, int v) {
  if (((int)d.size()) && d.front() == v) d.pop_front();
}
int getMax(deque<int> &d) { return d.front(); }
bool P(int sz) {
  long long cand;
  bool ok = false;
  deque<int> S[5];
  for (int i = (0); i < (int)(sz); i++) {
    for (int j = (0); j < (int)(m); j++) add(S[j], A[i][j]);
  }
  cand = 0;
  for (int j = (0); j < (int)(m); j++) cand += getMax(S[j]);
  if (cand <= k) {
    for (int j = (0); j < (int)(m); j++) ans[j] = getMax(S[j]);
    ok = true;
  }
  for (int i = (sz); i < (int)(n); i++) {
    for (int j = (0); j < (int)(m); j++) add(S[j], A[i][j]);
    for (int j = (0); j < (int)(m); j++) remove(S[j], A[i - sz][j]);
    cand = 0;
    for (int j = (0); j < (int)(m); j++) cand += getMax(S[j]);
    if (cand <= k) {
      for (int j = (0); j < (int)(m); j++) ans[j] = getMax(S[j]);
      ok = true;
    }
  }
  return ok;
}
int main() {
  while (scanf("%d%d%d", &n, &m, &k) >= 1) {
    for (int i = (0); i < (int)(n); i++) {
      for (int j = (0); j < (int)(m); j++) {
        scanf("%d", &A[i][j]);
      }
    }
    int a = 0;
    int b = n + 1;
    while (b - a > 1) {
      int c = (a + b) / 2;
      if (P(c)) {
        a = c;
      } else {
        b = c;
      }
    }
    if (a) {
      P(a);
    } else {
      memset(ans, 0, sizeof(ans));
    }
    for (int i = (0); i < (int)(m); i++) {
      if (i) printf(" ");
      printf("%d", ans[i]);
    }
    puts("");
  }
  return 0;
}
