#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int a[1000][1000];
int dp[(1 << 7) + 100][100][100];
bool vis[10000][10000];
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
struct node {
  int mask, x, y;
};
node pre[(1 << 7) + 100][100][100];
queue<node> Q;
bool vis2[(1 << 7) + 100][100][100];
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 {
    vis[x][y] = true;
    solve(mask, pre[mask][x][y].x, pre[mask][x][y].y);
  }
}
int main() {
  int x, y;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf("%d", &a[i][j]);
    }
  }
  for (int mask = 0; mask < (1 << k); mask++) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        dp[mask][i][j] = 999999999;
        pre[mask][i][j] = node{-1, -1, -1};
      }
    }
  }
  for (int i = 0; i < k; i++) {
    scanf("%d%d", &x, &y);
    dp[(1 << i)][x][y] = a[x][y];
    vis[x][y] = true;
    Q.push(node{1 << i, x, y});
    vis2[(1 << i)][x][y] = true;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (!vis[i][j]) {
        dp[0][i][j] = a[i][j];
        Q.push(node{0, i, j});
        vis2[0][i][j] = true;
      }
    }
  }
  node sta;
  while (!Q.empty()) {
    sta = Q.front();
    Q.pop();
    vis2[sta.mask][sta.x][sta.y] = false;
    for (int mask = 1; mask < (1 << k); mask++) {
      if ((mask & sta.mask) == 0) {
        if (dp[mask + sta.mask][sta.x][sta.y] > dp[sta.mask][sta.x][sta.y] +
                                                    dp[mask][sta.x][sta.y] -
                                                    a[sta.x][sta.y]) {
          pre[mask + sta.mask][sta.x][sta.y] = node{0, sta.mask, mask};
          dp[mask + sta.mask][sta.x][sta.y] = dp[sta.mask][sta.x][sta.y] +
                                              dp[mask][sta.x][sta.y] -
                                              a[sta.x][sta.y];
          if (!vis2[mask + sta.mask][sta.x][sta.y]) {
            vis2[mask + sta.mask][sta.x][sta.y] = true;
            Q.push(node{mask + sta.mask, sta.x, sta.y});
          }
        }
      }
    }
    for (int 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];
          Q.push(node{sta.mask, dx, dy});
          vis2[sta.mask][dx][dy] = true;
        }
      }
    }
  }
  int ans = 999999999;
  for (int i = 1; i <= n; i++) {
    for (int 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 (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      printf("%c", vis[i][j] ? 'X' : '.');
    }
    puts("");
  }
  return 0;
}
