#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
struct cell {
  int i, j;
  int value;
};
bool operator<(const cell A, const cell B) {
  if (A.value != B.value) return A.value < B.value;
  if (A.i != B.i) return A.i < B.i;
  return A.j < B.j;
}
int n, m;
long long k;
int a[MAXN][MAXN];
priority_queue<cell> q;
vector<long long> divisors;
map<int, vector<pair<int, int>>> value2Cell;
int treeSize[MAXN][MAXN];
pair<int, int> parent[MAXN][MAXN];
int answer[MAXN][MAXN];
pair<int, int> Find(pair<int, int> x) {
  if (parent[x.first][x.second] == x) return x;
  parent[x.first][x.second] = Find(parent[x.first][x.second]);
  return parent[x.first][x.second];
}
void Union(pair<int, int> u, pair<int, int> v) {
  u = Find(u);
  v = Find(v);
  if (parent[u.first][u.second] == parent[v.first][v.second]) {
    return;
  }
  if (treeSize[u.first][u.second] < treeSize[v.first][v.second]) {
    swap(u, v);
  }
  parent[v.first][v.second] = u;
  treeSize[u.first][u.second] += treeSize[v.first][v.second];
}
void useNode(int i, int j, int limit) {
  if (i - 1 >= 0 && a[i - 1][j] >= limit) Union({i, j}, {i - 1, j});
  if (i + 1 < n && a[i + 1][j] >= limit) Union({i, j}, {i + 1, j});
  if (j - 1 >= 0 && a[i][j - 1] >= limit) Union({i, j}, {i, j - 1});
  if (j + 1 < m && a[i][j + 1] >= limit) Union({i, j}, {i, j + 1});
}
void findDivisors() {
  for (long long d = 1; d * d <= k; d++) {
    if (k % d == 0) {
      divisors.push_back(d);
      if (d != k / d) divisors.push_back(k / d);
    }
  }
  sort(divisors.begin(), divisors.end());
}
bool used[MAXN][MAXN];
void DFS(int i, int j, pair<int, int> u, int value) {
  if (Find({i, j}) != u) return;
  used[i][j] = true;
  if (k > 0) {
    answer[i][j] = value;
    k -= value;
  }
  if (i - 1 >= 0 && used[i - 1][j] == false) DFS(i - 1, j, u, value);
  if (i + 1 < n && used[i + 1][j] == false) DFS(i + 1, j, u, value);
  if (j - 1 >= 0 && used[i][j - 1] == false) DFS(i, j - 1, u, value);
  if (j + 1 < m && used[i][j + 1] == false) DFS(i, j + 1, u, value);
}
void complete(pair<int, int> u, pair<int, int> original, long long value) {
  DFS(original.first, original.second, u, value);
  cout << "YES" << '\n';
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cout << answer[i][j] << " ";
    }
    cout << '\n';
  }
  exit(0);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  long long sum = 0;
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
      sum += a[i][j];
      q.push({i, j, a[i][j]});
      value2Cell[a[i][j]].push_back({i, j});
    }
  }
  if (sum < k) {
    cout << "NO" << '\n';
    return 0;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      treeSize[i][j] = 1;
      parent[i][j] = {i, j};
    }
  }
  findDivisors();
  for (int i = divisors.size() - 1; i >= 0; i--) {
    while (q.empty() == false && q.top().value >= divisors[i]) {
      useNode(q.top().i, q.top().j, divisors[i]);
      q.pop();
    }
    for (int j = 0; j < value2Cell[divisors[i]].size(); j++) {
      pair<int, int> u = Find(value2Cell[divisors[i]][j]);
      if (treeSize[u.first][u.second] * divisors[i] >= k) {
        complete(u, value2Cell[divisors[i]][j], divisors[i]);
      }
    }
  }
  cout << "NO" << '\n';
}
