#include <bits/stdc++.h>
using namespace std;
long long K, V;
bool possible = false;
pair<int, int> P[1000][1000];
vector<pair<int, int> > coord;
int N, M, A[1000][1000], RNK[1000][1000], SZ[1000][1000],
    RM[4] = {1, -1, 0, 0}, CM[4] = {0, 0, 1, -1}, maxSize = 1;
bool valid(int i, int j) { return 0 <= i && i < N && 0 <= j && j < M; }
bool cmp(const pair<int, int>& P1, const pair<int, int>& P2) {
  return A[P1.first][P1.second] > A[P2.first][P2.second];
}
pair<int, int> find(int r, int c) {
  pair<int, int> p = P[r][c];
  if (p.first == r && p.second == c)
    return p;
  else
    return P[r][c] = find(p.first, p.second);
}
void merge(int r1, int c1, int r2, int c2) {
  pair<int, int> p1 = find(r1, c1);
  pair<int, int> p2 = find(r2, c2);
  if (p1.first == p2.first && p1.second == p2.second) return;
  if (RNK[p1.first][p1.second] > RNK[p2.first][p2.second]) {
    P[p2.first][p2.second] = p1;
    SZ[p1.first][p1.second] += SZ[p2.first][p2.second];
    maxSize = max(maxSize, SZ[p1.first][p1.second]);
  } else if (RNK[p1.first][p1.second] < RNK[p2.first][p2.second]) {
    P[p1.first][p1.second] = p2;
    SZ[p2.first][p2.second] += SZ[p1.first][p1.second];
    maxSize = max(maxSize, SZ[p2.first][p2.second]);
  } else {
    RNK[p1.first][p1.second]++;
    merge(p1.first, p1.second, p2.first, p2.second);
  }
}
int main() {
  scanf("%d %d %I64d", &N, &M, &K);
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) {
      scanf("%d", &A[i][j]);
      P[i][j] = make_pair(i, j);
      RNK[i][j] = 0;
      SZ[i][j] = 1;
      coord.push_back(make_pair(i, j));
    }
  sort(coord.begin(), coord.end(), cmp);
  int lo = 0, hi = 0;
  while (lo < N * M) {
    int i = coord[lo].first;
    int j = coord[lo].second;
    V = A[i][j];
    while (hi < N * M && A[i][j] == A[coord[hi].first][coord[hi].second]) hi++;
    for (int i = lo; i < hi; i++) {
      int r = coord[i].first;
      int c = coord[i].second;
      for (int k = 0; k < 4; k++) {
        int rr = r + RM[k];
        int cc = c + CM[k];
        if (valid(rr, cc) && A[rr][cc] >= V) merge(r, c, rr, cc);
      }
    }
    if (K % V == 0 && K / V <= maxSize) {
      possible = true;
      break;
    }
    lo = hi;
  }
  if (!possible)
    printf("NO\n");
  else {
    printf("YES\n");
    bool done = false;
    for (int i = 0; i < N && !done; i++)
      for (int j = 0; j < M && !done; j++) {
        pair<int, int> p = find(i, j);
        if (SZ[p.first][p.second] >= K / V && A[i][j] == V) {
          queue<pair<int, int> > Q;
          Q.push(make_pair(i, j));
          A[i][j] = -2;
          for (long long l = 0; l < K / V; l++) {
            int r = Q.front().first;
            int c = Q.front().second;
            Q.pop();
            A[r][c] = -1;
            for (int k = 0; k < 4; k++) {
              int rr = r + RM[k];
              int cc = c + CM[k];
              if (valid(rr, cc) && A[rr][cc] >= V) {
                A[rr][cc] = -2;
                Q.push(make_pair(rr, cc));
              }
            }
          }
          done = true;
        }
      }
    for (int i = 0; i < N; i++)
      for (int j = 0; j < M; j++)
        printf("%I64d%c", A[i][j] == -1 ? V : 0, " \n"[j == M - 1]);
  }
}
