#include <bits/stdc++.h>
using namespace std;
int mat[1010][1010], setnum[1010][1010], parent[1000010], setsize[1000010];
vector<pair<int, pair<int, int> > > sorted;
bool visited[1010][1010];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, 1, -1};
int n, m;
long long int ketla;
int cmpval;
bool isvalid(int x, int y) {
  if (x >= 0 and x < n and y >= 0 and y < m) {
    return true;
  }
  return false;
}
void dfs(int x, int y) {
  if (ketla == 0) return;
  visited[x][y] = 1;
  ketla--;
  if (ketla == 0) return;
  for (int nn = 0; nn < 4; nn++) {
    if (isvalid(x + dx[nn], y + dy[nn]) and
        visited[x + dx[nn]][y + dy[nn]] == 0 and
        mat[x + dx[nn]][y + dy[nn]] >= cmpval) {
      dfs(x + dx[nn], y + dy[nn]);
    }
  }
}
int find(int node) {
  if (parent[node] != node) parent[node] = find(parent[node]);
  return parent[node];
}
void Union(int x, int y) {
  int xset = find(x);
  int yset = find(y);
  if (setsize[xset] > setsize[yset]) {
    parent[yset] = xset;
    setsize[xset] += setsize[yset];
  } else if (setsize[xset] < setsize[yset]) {
    parent[xset] = yset;
    setsize[yset] += setsize[xset];
  } else {
    parent[yset] = xset;
    setsize[xset] += setsize[yset];
  }
}
int main() {
  int i, j;
  long long int k;
  scanf("%d", &n);
  scanf("%d", &m);
  scanf("%lld", &k);
  ;
  int id = 1;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      scanf("%d", &mat[i][j]);
      setnum[i][j] = id;
      parent[id] = id;
      setsize[id] = 1;
      id++;
      sorted.push_back(make_pair(mat[i][j], make_pair(i, j)));
    }
  }
  memset(visited, 0, sizeof(visited));
  sort(sorted.rbegin(), sorted.rend());
  for (i = 0; i < n * m; i++) {
    int val = sorted[i].first;
    for (j = i; j < n * m; j++) {
      if (sorted[j].first != val) break;
    }
    j--;
    int end = j;
    for (j = i; j <= end; j++) {
      int x = sorted[j].second.first, y = sorted[j].second.second;
      for (int nn = 0; nn < 4; nn++) {
        int xx = x + dx[nn], yy = y + dy[nn];
        if (isvalid(xx, yy)) {
          if (mat[xx][yy] >= val) {
            if (find(setnum[xx][yy]) != find(setnum[x][y])) {
              Union(find(setnum[xx][yy]), find(setnum[x][y]));
            }
          }
        }
      }
    }
    for (j = i; j <= end; j++) {
      int x = sorted[j].second.first, y = sorted[j].second.second;
      if (k % mat[x][y] != 0) continue;
      long long int req = k / mat[x][y];
      cmpval = mat[x][y];
      ketla = req;
      if (ketla <= setsize[find(setnum[x][y])]) {
        dfs(x, y);
        if (ketla == 0) {
          printf("YES\n");
          for (int ii = 0; ii < n; ii++) {
            for (int jj = 0; jj < m; jj++) {
              if (visited[ii][jj] == 1)
                printf("%d ", mat[x][y]);
              else
                printf("0 ");
            }
            printf("\n");
          }
          return 0;
        }
      }
    }
    i = end;
  }
  printf("NO\n");
  return 0;
}
