#include <bits/stdc++.h>
using namespace std;
const int maxx = 600010;
int t, n, m;
int ans = 0, total = 0, sum = 0, cnt = 0;
int a[maxx];
int ax[11] = {0, 0, 0, 1, -1}, ay[11] = {0, 1, -1, 0, 0};
int xx[1111][1111], yy[1111][1111], bj[1111][1111], vis[1111][1111],
    mk[1111][1111];
char c[1111][1111];
struct node {
  int x;
  int y;
} s[maxx];
void dfs2(int x, int y, int prex, int prey, int cc, int dd) {
  if (prex && prey) {
    if (x == prex) {
      if (y > prey)
        c[x][y] = 'L';
      else
        c[x][y] = 'R';
    } else {
      if (x > prex)
        c[x][y] = 'U';
      else
        c[x][y] = 'D';
    }
  }
  for (register int i = 1; i <= 4; i++) {
    int bx = x + ax[i], by = y + ay[i];
    if (bx >= 1 && bx <= n && by >= 1 && by <= n) {
      if (c[bx][by] == '.' && xx[bx][by] == cc && yy[bx][by] == dd)
        dfs2(bx, by, x, y, cc, dd);
    }
  }
}
void bfs1(int x, int y) {
  queue<int> q;
  q.push(x);
  q.push(y);
  while (!q.empty()) {
    int bx = q.front();
    q.pop();
    int by = q.front();
    q.pop();
    for (register int i = 1; i <= 4; i++) {
      int cx = bx + ax[i], cy = by + ay[i];
      if (cx >= 1 && cx <= n && cy >= 1 && cy <= n && bj[cx][cy]) {
        if (vis[cx][cy]) continue;
        vis[cx][cy] = 1;
        total++;
        q.push(cx), q.push(cy);
        if (cnt <= 1) s[++cnt].x = cx, s[cnt].y = cy;
      }
    }
  }
}
void bfs2(int x, int y, int dx, int dy) {
  queue<int> q;
  q.push(x), q.push(y);
  ans = 1;
  while (!q.empty()) {
    int bx = q.front();
    q.pop();
    int by = q.front();
    q.pop();
    if (bx == dx && by == dy) ans = 0;
    for (register int i = 1; i <= 4; i++) {
      int cx = ax[i] + bx, cy = ay[i] + by;
      if (cx >= 1 && cx <= n && cy >= 1 && cy <= n && c[cx][cy] == '.') {
        if (xx[cx][cy] != dx || yy[cx][cy] != dy || vis[cx][cy]) continue;
        vis[cx][cy] = 1;
        q.push(cx), q.push(cy);
      }
    }
  }
}
void bfs3(int x, int y) {
  queue<int> q;
  q.push(x), q.push(y);
  while (!q.empty()) {
    int bx = q.front();
    q.pop();
    int by = q.front();
    q.pop();
    for (register int i = 1; i <= 4; i++) {
      int cx = bx + ax[i], cy = by + ay[i];
      if (cx >= 1 && cx <= n && cy >= 1 && cy <= n && bj[cx][cy]) {
        if (cx == s[2].x && cy == s[2].y && bx == s[1].x && by == s[1].y)
          q.push(s[2].x), q.push(s[2].y);
        else if (c[cx][cy] == '.') {
          if (cx == bx) {
            if (cy > by)
              c[cx][cy] = 'L';
            else
              c[cx][cy] = 'R';
          } else {
            if (cx > bx)
              c[cx][cy] = 'U';
            else
              c[cx][cy] = 'D';
          }
          q.push(cx), q.push(cy);
        }
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  for (register int i = 1; i <= n; i++)
    for (register int j = 1; j <= n; j++) {
      scanf("%d%d", &xx[i][j], &yy[i][j]);
      if (xx[i][j] == -1) bj[i][j] = 1;
      c[i][j] = '.';
    }
  for (register int i = 1; i <= n; i++)
    for (register int j = 1; j <= n; j++) {
      if (vis[i][j] || !bj[i][j]) continue;
      vis[i][j] = 1;
      total = 1;
      cnt = 0;
      s[++cnt].x = i, s[cnt].y = j;
      bfs1(i, j);
      if (total == 1) {
        ans = 1;
        i = n + 1;
        break;
      } else {
        if (s[1].x == s[2].x) {
          if (s[1].y > s[2].y)
            c[s[1].x][s[1].y] = 'L', c[s[2].x][s[2].y] = 'R';
          else
            c[s[1].x][s[1].y] = 'R', c[s[2].x][s[2].y] = 'L';
        } else {
          if (s[1].x > s[2].x)
            c[s[1].x][s[1].y] = 'U', c[s[2].x][s[2].y] = 'D';
          else
            c[s[1].x][s[1].y] = 'D', c[s[2].x][s[2].y] = 'U';
        }
        bfs3(s[1].x, s[1].y);
      }
    }
  if (ans)
    printf("INVALID");
  else {
    memset(vis, 0, sizeof(vis));
    for (register int i = 1; i <= n; i++)
      for (register int j = 1; j <= n; j++) {
        if (!bj[i][j] && c[i][j] == '.' && !vis[i][j]) {
          vis[i][j] = 1;
          cnt = 0;
          bfs2(i, j, xx[i][j], yy[i][j]);
          if (ans) {
            i = n + 1;
            break;
          }
          if (xx[xx[i][j]][yy[i][j]] != xx[i][j] ||
              yy[xx[i][j]][yy[i][j]] != yy[i][j]) {
            ans = 1;
            i = n + 1;
            break;
          }
          c[xx[i][j]][yy[i][j]] = 'X';
          dfs2(xx[i][j], yy[i][j], 0, 0, xx[i][j], yy[i][j]);
        }
      }
    for (register int i = 1; i <= n; i++)
      for (register int j = 1; j <= n; j++)
        if (c[i][j] == '.') {
          if (n == 1000)
            c[i][j] == 'L';
          else {
            ans = 1;
            i = n + 1;
            break;
          }
        }
    if (ans)
      printf("INVALID");
    else {
      printf("VALID\n");
      for (register int i = 1; i <= n; i++) {
        for (register int j = 1; j <= n; j++) printf("%c", c[i][j]);
        printf("\n");
      }
    }
  }
  return 0;
}
