#include <bits/stdc++.h>
using namespace std;
int nextInt() {
  int x;
  scanf("%d", &x);
  return x;
}
template <class T>
void debug(vector<T> a) {
  for (int i = 0; i < a.size(); ++i) {
    cerr << a[i] << " ";
  }
  cerr << endl;
}
int a[500 + 2][500 + 2];
int n;
int posx, posy;
string res;
void debug() {}
void turnOff() {
  res += "2";
  assert(a[posx][posy] != 0);
  a[posx][posy] = 0;
  debug();
}
void turnOn() {
  res += "1";
  assert(a[posx][posy] != 1);
  a[posx][posy] = 1;
  debug();
}
void move(int dx, int dy) {
  posx += dx;
  posy += dy;
  assert((dx != 0) != (dy != 0));
  if (dx == -1 && dy == 0) {
    res += "U";
  }
  if (dx == 1 && dy == 0) {
    res += "D";
  }
  if (dx == 0 && dy == -1) {
    res += "L";
  }
  if (dx == 0 && dy == 1) {
    res += "R";
  }
}
bool used[500 + 2][500 + 2];
int rowLo[500 + 2];
int rowHi[500 + 2];
int colLo[500 + 2];
int colHi[500 + 2];
void fillDfs() {
  if (a[posx][posy] == 0) {
    turnOn();
  }
  used[posx][posy] = true;
  rowLo[posx] = min(rowLo[posx], posy);
  rowHi[posx] = max(rowHi[posx], posy);
  colLo[posy] = min(colLo[posy], posx);
  colHi[posy] = max(colHi[posy], posx);
  for (int dx = -1; dx <= 1; ++dx) {
    for (int dy = -1; dy <= 1; ++dy) {
      if ((dx != 0) != (dy != 0)) {
        int nx = posx + dx;
        int ny = posy + dy;
        if (1 <= nx && nx <= n && 1 <= ny && ny <= n && !used[nx][ny]) {
          if (dx != 0 && colLo[ny] <= nx && nx <= colHi[ny] ||
              dy != 0 && rowLo[nx] <= ny && ny <= rowHi[nx]) {
            move(dx, dy);
            fillDfs();
            move(-dx, -dy);
          }
        }
      }
    }
  }
}
bool fill() {
  for (int i = 1; i <= n; ++i) {
    rowLo[i] = n + 1;
    rowHi[i] = 0;
    colLo[i] = n + 1;
    colHi[i] = 0;
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if (a[i][j] == 1) {
        rowLo[i] = min(rowLo[i], j);
        rowHi[i] = max(rowHi[i], j);
        colLo[j] = min(colLo[j], i);
        colHi[j] = max(colHi[j], i);
      }
    }
  }
  fillDfs();
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if (a[i][j] == 1 && !used[i][j]) {
        return false;
      }
    }
  }
  return true;
}
void cleanDfs() {
  used[posx][posy] = true;
  for (int dx = -1; dx <= 1; ++dx) {
    for (int dy = -1; dy <= 1; ++dy) {
      if ((dx != 0) != (dy != 0)) {
        int nx = posx + dx;
        int ny = posy + dy;
        if (1 <= nx && nx <= n && 1 <= ny && ny <= n && !used[nx][ny] &&
            a[nx][ny] == 1) {
          move(dx, dy);
          cleanDfs();
          turnOff();
          move(-dx, -dy);
        }
      }
    }
  }
}
void clean() {
  memset(used, 0, sizeof(used));
  cleanDfs();
  turnOff();
}
int main() {
  n = nextInt();
  posx = nextInt();
  posy = nextInt();
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      a[i][j] = nextInt();
    }
  }
  if (fill()) {
    clean();
    printf("YES\n%s\n", res.c_str());
  } else {
    printf("NO\n");
  }
  return 0;
}
