#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000007;
const int dy[4] = {1, 0, 0, -1};
const int dx[4] = {0, 1, -1, 0};
int n, m;
long long k;
int board[1000][1000];
vector<pair<int, int>> pArr;
vector<bool> bUsed;
inline int getNum(int i, int j) { return i * m + j; }
pair<int, int> getCoord(int num) {
  pair<int, int> ret;
  ret.first = num / m;
  ret.second = num % m;
  return ret;
}
vector<int> getNeighborhood(int num) {
  pair<int, int> coord = getCoord(num);
  vector<int> ret;
  for (int i = 0; i < (4); ++i) {
    int ny = coord.first + dy[i];
    int nx = coord.second + dx[i];
    if (ny >= n || ny < 0 || nx >= m || nx < 0) continue;
    ret.push_back(ny * m + nx);
  }
  return ret;
}
struct dsjSet {
  vector<int> prnt, rank, size;
  dsjSet(int n) : prnt(n), rank(n, 0), size(n, 1) {
    for (int i = 0; i < (n); ++i) prnt[i] = i;
  }
  int find(int u) {
    if (prnt[u] == u) return u;
    return prnt[u] = find(prnt[u]);
  }
  int merge(int u, int v) {
    u = find(u);
    v = find(v);
    if (u == v) return u;
    if (rank[u] > rank[v]) swap(u, v);
    if (rank[u] == rank[v]) rank[v]++;
    prnt[u] = v;
    size[v] += size[u];
    return v;
  }
  int getSize(int u) {
    u = find(u);
    return size[u];
  }
};
int solBoard[1000][1000];
void dfs(int y, int x, int& cnt, int height) {
  if (y < 0 || y >= n || x < 0 || x >= m) return;
  if (board[y][x] < height) return;
  if (solBoard[y][x] == height) return;
  if (cnt == 0) return;
  solBoard[y][x] = height;
  cnt--;
  dfs(y + 1, x, cnt, height);
  dfs(y - 1, x, cnt, height);
  dfs(y, x + 1, cnt, height);
  dfs(y, x - 1, cnt, height);
}
void printBoard() {
  for (int i = 0; i < (n); ++i) {
    for (int j = 0; j < (m); ++j) cout << solBoard[i][j] << " ";
    cout << endl;
  }
}
int main() {
  cin >> n >> m >> k;
  pArr.resize(n * m);
  bUsed.resize(n * m);
  int iter = 0;
  for (int i = 0; i < (n); ++i)
    for (int j = 0; j < (m); ++j) {
      scanf("%d", &(board[i][j]));
      pArr[iter] = make_pair(board[i][j], getNum(i, j));
      iter++;
    }
  dsjSet sets(n * m);
  sort(pArr.begin(), pArr.end(), greater<pair<int, int>>());
  int i = 0;
  int count = 0, height = INF, sz;
  for (i; i < pArr.size(); ++i) {
    height = pArr[i].first;
    int coordNum = pArr[i].second;
    vector<int> neighborhood = getNeighborhood(coordNum);
    for (int j = 0; j < (neighborhood.size()); ++j)
      if (bUsed[neighborhood[j]]) sets.merge(coordNum, neighborhood[j]);
    sz = sets.getSize(coordNum);
    bUsed[coordNum] = true;
    if ((long long)height * sz >= k)
      if (((long long)height * sz - k) % height == 0) {
        count = k / height;
        break;
      }
  }
  if (i == pArr.size()) {
    cout << "NO";
    return 0;
  }
  pair<int, int> start = getCoord(pArr[i].second);
  int startY = start.first;
  int startX = start.second;
  int cnt = count;
  dfs(startY, startX, cnt, height);
  cout << "YES" << endl;
  printBoard();
  return 0;
}
