#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 1000;
const long long INF64 = 1e15 + 1000;
const int M = 26;
const int N = 1000 + 100;
const int MOD = 1e9 + 7;
const double EPS = 1e-9;
const double PI = 3.14159265359;
long long gcd(long long a, long long b) { return a == 0 ? b : gcd(b % a, a); }
int n, m;
int p[N * N];
int s[N * N];
int ind(int i, int j) { return i * m + j; }
int get(int x) {
  if (x == p[x]) return x;
  return p[x] = get(p[x]);
}
void merge(int x, int y) {
  x = get(x);
  y = get(y);
  if (x == y) {
    return;
  }
  if (s[x] < s[y]) {
    swap(x, y);
  }
  p[y] = x;
  s[x] += s[y];
}
void init(int n, int m) {
  for (int i = 0; i < int(n); ++i) {
    for (int j = 0; j < int(m); ++j) {
      p[ind(i, j)] = ind(i, j);
      s[ind(i, j)] = 1;
    }
  }
}
int d[N][N];
int ans[N][N];
bool used[N][N];
bool u[N][N];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
void bfs(int x, int y, int need, int val) {
  queue<pair<int, int>> q;
  int cnt = 0;
  q.push({x, y});
  u[x][y] = true;
  while (cnt < need && !q.empty()) {
    cnt++;
    auto p = q.front();
    q.pop();
    x = p.first;
    y = p.second;
    ans[x][y] = val;
    for (int i = 0; i < int(4); ++i) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (nx >= 0 && nx < N && ny >= 0 && ny < N && !u[nx][ny] &&
          d[nx][ny] >= val) {
        q.push({nx, ny});
        u[nx][ny] = true;
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long k;
  cin >> n >> m >> k;
  int mx = 0;
  set<int> a;
  for (int i = 0; i < int(n); ++i) {
    for (int j = 0; j < int(m); ++j) {
      cin >> d[i][j];
      mx = max(mx, d[i][j]);
      a.insert(d[i][j]);
    }
  }
  vector<pair<long long, long long>> mb;
  long long root = sqrt(k);
  for (int i = int(1); i < int(min(k, (long long)1e6) + 1); ++i) {
    if (k % i == 0 && k / i <= mx && i <= n * m && a.count(k / i)) {
      mb.push_back({i, k / i});
    }
  }
  init(n, m);
  for (auto p : mb) {
    long long c = p.first;
    long long need = p.second;
    vector<pair<int, int>> temp;
    for (int i = 0; i < int(n); ++i) {
      for (int j = 0; j < int(m); ++j) {
        if (d[i][j] == need) {
          temp.push_back({i, j});
        }
        if (d[i][j] >= need) {
          if (i > 0 && !used[i][j] && d[i - 1][j] >= need) {
            merge(ind(i, j), ind(i - 1, j));
          }
          if (j > 0 && !used[i][j] && d[i][j - 1] >= need) {
            merge(ind(i, j), ind(i, j - 1));
          }
          if (!used[i][j] && d[i + 1][j] >= need) {
            merge(ind(i, j), ind(i + 1, j));
          }
          if (!used[i][j] && d[i][j + 1] >= need) {
            merge(ind(i, j), ind(i, j + 1));
          }
          used[i][j] = true;
        }
      }
    }
    for (auto pp : temp) {
      int i = pp.first;
      int j = pp.second;
      if (s[get(ind(i, j))] >= c) {
        bfs(i, j, c, need);
        cout << "YES\n";
        for (int i = 0; i < int(n); ++i) {
          for (int j = 0; j < int(m); ++j) {
            cout << ans[i][j] << ' ';
          }
          cout << '\n';
        }
        return 0;
      }
    }
  }
  cout << "NO\n";
}
