#include <bits/stdc++.h>
using namespace std;
const int xd[4] = {0, 1, 0, -1}, yd[4] = {1, 0, -1, 0};
const int label[4] = {'U', 'L', 'D', 'R'};
template <typename t>
bool ckmin(t& a, const t& b) {
  return a > b ? a = b, true : false;
}
template <typename t>
bool ckmax(t& a, const t& b) {
  return a < b ? a = b, true : false;
}
char field[1010][1010];
pair<int, int> dests[1010][1010];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  memset(field, 0, sizeof(field));
  int n;
  cin >> n;
  queue<pair<int, int> > Xs;
  queue<pair<int, int> > infs;
  for (auto((r)) = (0); ((r)) < ((n)); ++((r))) {
    for (auto((c)) = (0); ((c)) < ((n)); ++((c))) {
      int rr, cc;
      cin >> rr >> cc;
      rr--;
      cc--;
      if (r == rr && c == cc) Xs.push(make_pair(r, c));
      if (rr == -2 && cc == -2) infs.push(make_pair(r, c));
      dests[r][c] = make_pair(rr == -2 ? -1 : rr, cc == -2 ? -1 : cc);
    }
  }
  while (!Xs.empty()) {
    pair<int, int> start = Xs.front();
    Xs.pop();
    field[start.first][start.second] = 'X';
    queue<pair<int, int> > q;
    q.push(start);
    while (!q.empty()) {
      auto [r, c] = q.front();
      q.pop();
      for (auto((i)) = (0); ((i)) < ((4)); ++((i))) {
        if (r + yd[i] >= 0 && r + yd[i] < n && c + xd[i] >= 0 &&
            c + xd[i] < n && dests[r + yd[i]][c + xd[i]] == start &&
            field[r + yd[i]][c + xd[i]] == 0) {
          field[r + yd[i]][c + xd[i]] = label[i];
          q.push(make_pair(r + yd[i], c + xd[i]));
        }
      }
    }
  }
  while (!infs.empty()) {
    pair<int, int> start = infs.front();
    auto [r, c] = start;
    infs.pop();
    if (field[start.first][start.second]) continue;
    int partner = -1;
    for (auto((i)) = (0); ((i)) < ((4)); ++((i)))
      if (r + yd[i] >= 0 && r + yd[i] < n && c + xd[i] >= 0 && c + xd[i] < n &&
          dests[r + yd[i]][c + xd[i]] == make_pair(-1, -1))
        partner = i;
    field[start.first][start.second] = label[(partner + 2) % 4];
    if (partner == -1) {
      cout << "INVALID\n";
      return 0;
    }
    queue<pair<int, int> > q;
    q.push(start);
    while (!q.empty()) {
      auto [r, c] = q.front();
      q.pop();
      for (auto((i)) = (0); ((i)) < ((4)); ++((i))) {
        if (r + yd[i] >= 0 && r + yd[i] < n && c + xd[i] >= 0 &&
            c + xd[i] < n && dests[r + yd[i]][c + xd[i]] == make_pair(-1, -1) &&
            field[r + yd[i]][c + xd[i]] == 0) {
          field[r + yd[i]][c + xd[i]] = label[i];
          q.push(make_pair(r + yd[i], c + xd[i]));
        }
      }
    }
  }
  for (auto((r)) = (0); ((r)) < ((n)); ++((r)))
    for (auto((c)) = (0); ((c)) < ((n)); ++((c)))
      if (field[r][c] == 0) {
        cout << "INVALID\n";
        return 0;
      }
  cout << "VALID\n";
  for (auto((r)) = (0); ((r)) < ((n)); ++((r))) {
    for (auto((c)) = (0); ((c)) < ((n)); ++((c))) cout << field[r][c];
    cout << '\n';
  }
  return 0;
}
