#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;   }   