#include <bits/stdc++.h>
using namespace std;
int rep[2000005];
int sz[2000005];
void dsu(int n) {
  for (int i = 0; i < n; i++) rep[i] = i, sz[i] = 1;
}
int findSet(int a) { return ((rep[a] == a) ? a : rep[a] = findSet(rep[a])); }
int mergeSet(int a, int b) {
  int y = findSet(b);
  int x = findSet(a);
  if (x != y) {
    rep[x] = y;
    sz[y] += sz[x];
    sz[x] = 0;
  }
}
long long int grid[1005][1005];
int vis[1005][1005] = {0};
vector<pair<long long int, pair<int, int> > > v;
int n, m;
long long int k;
int dx[] = {-1, 0, 0, 1};
int dy[] = {0, -1, 1, 0};
int solx = -1;
int soly = -1;
long long int sol;
int cnt;
void floodfill(int x, int y) {
  if (cnt < 1) return;
  vis[x][y] = 1;
  grid[x][y] = sol;
  cnt--;
  for (int i = 0; i < 4; i++) {
    int newx = x + dx[i];
    int newy = y + dy[i];
    if (newx >= 0 && newx < n && newy >= 0 && newy < m && !vis[newx][newy] &&
        grid[newx][newy] >= sol) {
      floodfill(newx, newy);
    }
  }
}
void solve() {
  cin >> n >> m;
  cin >> k;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> grid[i][j];
      v.push_back(make_pair(grid[i][j], make_pair(i, j)));
    }
  }
  sort(v.begin(), v.end(), greater<pair<long long int, pair<int, int> > >());
  dsu(n * m);
  int i = 0, j = 0;
  while (i < v.size()) {
    j = i;
    while (j < v.size()) {
      if (v[i].first == v[j].first) {
        int x = v[j].second.first;
        int y = v[j].second.second;
        for (int k = 0; k < 4; k++) {
          int newx = x + dx[k];
          int newy = y + dy[k];
          if (newx >= 0 && newx < n && newy >= 0 && newy < m &&
              grid[newx][newy] >= v[j].first) {
            mergeSet(newx * m + newy, x * m + y);
          }
        }
      } else
        break;
      j++;
    }
    for (int l = i; l < j; l++) {
      if (v[l].first && (k % v[l].first == 0) &&
          sz[findSet(v[l].second.first * m + v[l].second.second)] >=
              k / v[l].first) {
        solx = v[l].second.first;
        soly = v[l].second.second;
        sol = v[l].first;
        cnt = k / v[l].first;
        break;
      }
    }
    i = j;
  }
  if (solx == -1 || soly == -1)
    cout << "NO\n";
  else {
    floodfill(solx, soly);
    cout << "YES\n";
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m - 1; j++) {
        if (vis[i][j])
          cout << grid[i][j] << ' ';
        else
          cout << "0 ";
      }
      if (vis[i][m - 1])
        cout << grid[i][m - 1] << '\n';
      else
        cout << "0\n";
    }
  }
}
int main() {
  solve();
  return 0;
}
