#include <bits/stdc++.h>
using namespace std;
const int nn = 110;
const int inf = 0x3fffffff;
int n, m, k;
int a[nn][nn];
int dp[(1 << 7) + 10][nn][nn];
bool use[nn][nn];
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
struct node {
  int mask, x, y;
  node() {}
  node(int mmask, int xx, int yy) { mask = mmask, x = xx, y = yy; }
};
node pre[(1 << 7) + 10][nn][nn];
queue<node> que;
bool inque[(1 << 7) + 10][nn][nn];
void solve(int mask, int x, int y) {
  if (pre[mask][x][y].mask == -1) return;
  if (pre[mask][x][y].mask == 0) {
    solve(pre[mask][x][y].x, x, y);
    solve(pre[mask][x][y].y, x, y);
  } else {
    use[x][y] = true;
    solve(mask, pre[mask][x][y].x, pre[mask][x][y].y);
  }
}
int main() {
  int i, j, x, y, e;
  while (scanf("%d%d%d", &n, &m, &k) != EOF) {
    for (i = 1; i <= n; i++)
      for (j = 1; j <= m; j++) scanf("%d", &a[i][j]);
    memset(use, false, sizeof(use));
    memset(inque, false, sizeof(inque));
    for (e = 0; e < (1 << k); e++) {
      for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
          dp[e][i][j] = inf;
          pre[e][i][j] = node(-1, -1, -1);
        }
      }
    }
    for (i = 0; i < k; i++) {
      scanf("%d%d", &x, &y);
      dp[(1 << i)][x][y] = a[x][y];
      use[x][y] = true;
      que.push(node(1 << i, x, y));
      inque[(1 << i)][x][y] = true;
    }
    for (i = 1; i <= n; i++) {
      for (j = 1; j <= m; j++) {
        if (!use[i][j]) {
          dp[0][i][j] = a[i][j];
          que.push(node(0, i, j));
          inque[0][i][j] = true;
        }
      }
    }
    node sta;
    while (que.size()) {
      sta = que.front();
      que.pop();
      inque[sta.mask][sta.x][sta.y] = false;
      for (e = 1; e < (1 << k); e++) {
        if ((e & sta.mask) == 0) {
          if (dp[e ^ sta.mask][sta.x][sta.y] > dp[sta.mask][sta.x][sta.y] +
                                                   dp[e][sta.x][sta.y] -
                                                   a[sta.x][sta.y]) {
            pre[e ^ sta.mask][sta.x][sta.y] = node(0, sta.mask, e);
            dp[e ^ sta.mask][sta.x][sta.y] = dp[sta.mask][sta.x][sta.y] +
                                             dp[e][sta.x][sta.y] -
                                             a[sta.x][sta.y];
            if (!inque[e ^ sta.mask][sta.x][sta.y]) {
              inque[e ^ sta.mask][sta.x][sta.y] = true;
              que.push(node(e ^ sta.mask, sta.x, sta.y));
            }
          }
        }
      }
      for (i = 0; i < 4; i++) {
        int dx = sta.x + dir[i][0];
        int dy = sta.y + dir[i][1];
        if (dx >= 1 && dx <= n && dy >= 1 && dy <= m) {
          if (dp[sta.mask][dx][dy] > dp[sta.mask][sta.x][sta.y] + a[dx][dy]) {
            pre[sta.mask][dx][dy] = node(1, sta.x, sta.y);
            dp[sta.mask][dx][dy] = dp[sta.mask][sta.x][sta.y] + a[dx][dy];
            que.push(node(sta.mask, dx, dy));
            inque[sta.mask][dx][dy] = true;
          }
        }
      }
    }
    int ans = inf;
    for (i = 1; i <= n; i++) {
      for (j = 1; j <= m; j++) {
        if (dp[(1 << k) - 1][i][j] < ans) {
          ans = dp[(1 << k) - 1][i][j];
          sta = node((1 << k) - 1, i, j);
        }
      }
    }
    printf("%d\n", ans);
    solve(sta.mask, sta.x, sta.y);
    for (i = 1; i <= n; i++) {
      for (j = 1; j <= m; j++) {
        printf("%c", use[i][j] ? 'X' : '.');
      }
      puts("");
    }
  }
  return 0;
}
