#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
int n, m;
long long K;
bool boss[maxn][maxn];
long long v[maxn][maxn];
long long A[maxn][maxn];
int S[maxn * maxn];
bool exs[maxn][maxn];
int sz[maxn * maxn];
int ans[maxn][maxn];
long long color[maxn][maxn];
pair<long long, long long> V[maxn * maxn];
queue<pair<long long, long long> > Q;
bool inq[maxn][maxn];
inline int findS(int x) {
  if (S[x] < 0) return x;
  return (S[x] = findS(S[x]));
}
inline void unionS(int x, int y) {
  int z1 = findS(x), z2 = findS(y);
  if (z1 == z2) return;
  sz[z1] += sz[z2];
  S[z2] = z1;
}
void solve(int x, int y) {
  Q = *new queue<pair<long long, long long> >();
  int w = v[x][y];
  for (int i = (0); i <= (n + 1); i++)
    for (int j = (0); j <= (m + 1); j++) exs[i][j] = false;
  for (int i = (1); i <= (n); i++) {
    for (int j = (1); j <= (m); j++) {
      color[i][j] = 0;
      exs[i][j] = false;
      inq[i][j] = false;
      if (A[i][j] >= A[x][y]) exs[i][j] = true;
    }
  }
  int elems = 1;
  inq[x][y] = true;
  Q.push(make_pair(x, y));
  color[x][y] = A[x][y];
  int dx[4] = {0, 0, -1, 1};
  int dy[4] = {-1, 1, 0, 0};
  bool ok = true;
  while (Q.size() > 0) {
    if (elems >= w) break;
    int a = Q.front().first, b = Q.front().second;
    Q.pop();
    for (int i = (0); i <= (3); i++) {
      int ap = a + dx[i], bp = b + dy[i];
      if (exs[ap][bp] && !inq[ap][bp]) {
        inq[ap][bp] = true;
        color[ap][bp] = A[x][y];
        Q.push(make_pair(ap, bp));
        elems++;
        if (elems == w) {
          ok = false;
          break;
        }
      }
    }
    if (!ok) break;
  }
  assert(elems == w);
  for (int i = (1); i <= (n); i++) {
    for (int j = (1); j <= (m); j++) {
      printf("%lld", color[i][j]);
      if (j < m) printf(" ");
    }
    printf("\n");
  }
  return;
}
inline bool bort(pair<long long, long long> a, pair<long long, long long> b) {
  if (a.first != b.first) return a.first < b.first;
  return boss[a.second / maxn][a.second % maxn] <
         boss[b.second / maxn][b.second % maxn];
}
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  scanf("%lld", &K);
  int idx = 0;
  for (int i = (1); i <= (n); i++) {
    for (int j = (1); j <= (m); j++) {
      boss[i][j] = false;
    }
  }
  for (int i = (1); i <= (n); i++) {
    for (int j = (1); j <= (m); j++) {
      scanf("%lld", &A[i][j]);
      v[i][j] = (K + A[i][j] - 1) / A[i][j];
      if (v[i][j] * A[i][j] == K) {
        boss[i][j] = true;
      }
      idx++;
      V[idx] = make_pair(-A[i][j], ((i)*maxn + (j)));
      exs[i][j] = false;
      S[((i)*maxn + (j))] = -1;
      sz[((i)*maxn + (j))] = 1;
    }
  }
  sort(V + 1, V + idx + 1, bort);
  for (int z = (1); z <= (idx); z++) {
    long long w = K / (-V[z].first), x = V[z].second / maxn,
              y = V[z].second % maxn;
    if (x - 1 >= 1 && exs[x - 1][y]) {
      unionS(((x)*maxn + (y)), ((x - 1) * maxn + (y)));
    }
    if (x + 1 <= n && exs[x + 1][y]) {
      unionS(((x)*maxn + (y)), ((x + 1) * maxn + (y)));
    }
    if (y - 1 >= 1 && exs[x][y - 1]) {
      unionS(((x)*maxn + (y)), ((x)*maxn + (y - 1)));
    }
    if (y + 1 <= m && exs[x][y + 1]) {
      unionS(((x)*maxn + (y)), ((x)*maxn + (y + 1)));
    }
    exs[x][y] = true;
    if (boss[x][y] && sz[findS(((x)*maxn + (y)))] >= w) {
      printf("YES\n");
      solve(x, y);
      return 0;
    }
  }
  printf("NO\n");
}
