#include <bits/stdc++.h>
using namespace std;
long long r, c, grid[1000005], k, begin = -1;
pair<long long, long long> num[1000005];
long long par[1000005];
long long rnk[1000005];
long long sz[1000005];
long long n;
bool visited[1000005] = {0};
bool found = false;
long long ans[1000005] = {0};
long long mv[5];
long long find(long long x) {
  if (par[x] == x) return x;
  return par[x] = find(par[x]);
}
bool check(int a, int b) { return find(par[a]) == find(par[b]); }
void join(int a, int b) {
  if (check(a, b)) return;
  int p1 = find(par[a]);
  int p2 = find(par[b]);
  if (rnk[p1] > rnk[p2]) {
    par[p2] = p1;
    sz[p1] += sz[p2];
  } else {
    par[p1] = p2;
    sz[p2] += sz[p1];
    if (rnk[p1] == rnk[p2]) {
      rnk[p2]++;
    }
  }
}
long long get(int x) { return sz[find(par[x])]; }
void reset() {
  for (long long(i) = (1); (i) <= (n); (i)++) {
    rnk[i] = 1;
    par[i] = i;
    sz[i] = 1;
  }
}
bool possible(int idx, int i) {
  if (idx + mv[i] < 1 || idx + mv[i] > r * c || (i == 0 && (idx % c == 0)) ||
      (i == 1 && (idx % c == 1))) {
    return false;
  }
  return true;
}
void build(int idx, long long value) {
  queue<long long> q;
  q.push(idx);
  ans[idx] = value;
  k -= value;
  while (!q.empty()) {
    int now = q.front();
    q.pop();
    for (long long(i) = (0); (i) < (4); (i)++) {
      if (k == 0) break;
      int temp = now + mv[i];
      if (possible(now, i) && grid[temp] >= value && ans[temp] == 0) {
        k -= value;
        ans[temp] = value;
        q.push(temp);
      }
    }
  }
}
bool Compare(pair<long long, long long> a, pair<long long, long long> b) {
  return a.first > b.first;
}
void input() {
  cin >> r >> c >> k;
  for (long long(j) = (1); (j) <= (r); (j)++) {
    for (long long(i) = (1); (i) <= (c); (i)++) {
      cin >> grid[(j - 1) * c + i];
      num[(j - 1) * c + i] = {grid[(j - 1) * c + i], (j - 1) * c + i};
    }
  }
  sort(num + 1, num + 1 + r * c, Compare);
  n = r * c;
}
void solve() {
  for (long long(i) = (1); (i) <= (n); (i)++) {
    for (long long(j) = (0); (j) < (4); (j)++) {
      if (possible(num[i].second, j) &&
          grid[num[i].second + mv[j]] >= num[i].first) {
        join(num[i].second + mv[j], num[i].second);
      }
    }
    int temp = get(num[i].second);
    if (k % num[i].first == 0 && k / num[i].first <= temp) {
      build(num[i].second, num[i].first);
      cout << "YES\n";
      for (long long(y) = (1); (y) <= (r); (y)++) {
        for (long long(x) = (1); (x) <= (c); (x)++) {
          cout << ans[(y - 1) * c + x] << (x == c ? "\n" : " ");
        }
      }
      return;
    }
    visited[num[i].second] = 1;
  }
  cout << "NO\n";
}
void LetsRock() {
  mv[0] = 1;
  mv[1] = -1;
  mv[2] = c;
  mv[3] = -c;
  solve();
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  input();
  reset();
  LetsRock();
  return 0;
}
