#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int, int> pii;
const int maxn = 11, maxm = (1 << 10) + 5;
struct Node {
int x, y, s;
} path[maxn][maxn][maxm];
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int n, m, k, G[maxn][maxn];
int dp[maxn][maxn][maxm];
int inq[maxn][maxn];
queue<pii> q;
void spfa(int s) {
while (!q.empty()) {
auto [x, y] = q.front(); q.pop();
inq[x][y] = false;
for (int i = 0; i < 4; i++) {
int xx = x + dx[i], yy = y + dy[i];
if (xx < 1 || xx > n || yy < 1 || yy > m) continue;
if (dp[xx][yy][s] > dp[x][y][s] + G[xx][yy]) {
dp[xx][yy][s] = dp[x][y][s] + G[xx][yy];
path[xx][yy][s] = {x, y, s};
if (!inq[xx][yy]) { q.push({xx, yy}); inq[xx][yy] = 1; }
}
}
}
}
int vis[maxn][maxn];
void dfs(int x, int y, int s) {
if (path[x][y][s].s == 0) return;
vis[x][y] = true;
auto [xx, yy, ss] = path[x][y][s];
dfs(xx, yy, ss);
if (xx == x && yy == y) dfs(xx, yy, ss ^ s);
}
inline void init() {
memset(dp, 0x3f, sizeof(dp));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
init();
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> G[i][j];
if (G[i][j] == 0) {
dp[i][j][1 << k] = 0;
k += 1;
}
}
}
for (int s = 1; s < (1 << k); s++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
for (int k = s & (s - 1); k; k = (k - 1) & s) {
if (dp[i][j][s] > dp[i][j][k] + dp[i][j][s ^ k] - G[i][j]){
dp[i][j][s] = dp[i][j][k] + dp[i][j][s ^ k] - G[i][j];
path[i][j][s] = {i, j, k};
}
}
if (dp[i][j][s] < inf) { q.push({i, j}); inq[i][j] = 1; }
}
}
spfa(s);
}
int i = 1, j = 1;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
if (G[i][j] == 0) break;
}
if (G[i][j] == 0) break;
}
cout << dp[i][j][(1 << k) - 1] << endl;
dfs(i, j, (1 << k) - 1);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (G[i][j] == 0) cout << 'x';
else if (vis[i][j]) cout << 'o';
else cout << '_';
}
cout << endl;
}
return 0;
}