#include <bits/stdc++.h>
using namespace std;
long long int mod = 1000000007;
long long int gcd(long long int a, long long int b) {
  if (b < a)
    return gcd(b, a);
  else if (b % a == 0)
    return a;
  else
    return gcd(b % a, a);
}
long long fast_exp(long long a, long long n, long long mod1) {
  if (n == 0)
    return 1;
  else if (n == 1)
    return a;
  if (n % 2 == 0)
    return fast_exp((a * a) % mod1, n / 2, mod1);
  else
    return (a * fast_exp((a * a) % mod1, n / 2, mod1)) % mod1;
}
bool is_square(long long a) {
  long long int b = sqrt(a);
  if (b * b == a)
    return true;
  else
    return false;
}
long long n_fact[1000001];
void calc_fact(int n) {
  n_fact[0] = 1;
  for (int c(1); c <= n; c++) n_fact[c] = (c * n_fact[c - 1]) % mod;
  return;
}
long long calc_inverse_mod(long long x, long long mod) {
  return fast_exp(x, mod - 2, mod);
}
bool n_primes[100001] = {false};
void calc_primes(int n) {
  for (int c(2); c <= 100000; c++) {
    if (n_primes[c] == true) continue;
    for (int c1(c + c); c1 <= 100000; c1 = c1 + c) n_primes[c1] = true;
  }
  return;
}
bool is_palindrome(string a) {
  string b = a;
  reverse(b.begin(), b.end());
  if (b == a)
    return true;
  else
    return false;
}
char res[1001][1001] = {0};
pair<int, int> is_done[1001][1001];
vector<vector<pair<int, int>>> arr;
int n;
bool pair_equal(pair<int, int> a, pair<int, int> b) {
  return a.first == b.first && a.second == b.second;
}
void mark_them(int x, int y) {
  if (x + 1 < n && y < n && res[x + 1][y] == 0) {
    if (pair_equal(arr[x][y], arr[x + 1][y])) {
      res[x + 1][y] = 'U';
      is_done[x + 1][y] = (is_done[x][y]);
      mark_them(x + 1, y);
    }
  }
  if (x < n && y + 1 < n && res[x][y + 1] == 0) {
    if (pair_equal(arr[x][y], arr[x][y + 1])) {
      res[x][1 + y] = 'L';
      is_done[x][1 + y] = (is_done[x][y]);
      mark_them(x, y + 1);
    }
  }
  if (x - 1 >= 0 && res[x - 1][y] == 0) {
    if (pair_equal(arr[x][y], arr[x - 1][y])) {
      res[x - 1][y] = 'D';
      is_done[x - 1][y] = (is_done[x][y]);
      mark_them(x - 1, y);
    }
  }
  if (y - 1 >= 0 && res[x][y - 1] == 0) {
    if (pair_equal(arr[x][y], arr[x][y - 1])) {
      res[x][y - 1] = 'R';
      is_done[x][y - 1] = (is_done[x][y]);
      mark_them(x, y - 1);
    }
  }
  return;
}
bool valid(int x, int y) {
  if (x + 1 < n && arr[x + 1][y].first == -2) {
    res[x][y] = 'D';
    if (res[x + 1][y] == 0) res[x + 1][y] = 'U';
    return true;
  }
  if (x - 1 >= 0 && arr[x - 1][y].first == -2) {
    res[x][y] = 'U';
    if (res[x - 1][y] == 0) res[x - 1][y] = 'D';
    return true;
  }
  if (y + 1 < n && arr[x][y + 1].first == -2) {
    res[x][y] = 'R';
    if (res[x][y + 1] == 0) res[x][y + 1] = 'L';
    return true;
  }
  if (y - 1 >= 0 && arr[x][y - 1].first == -2) {
    res[x][y] = 'L';
    if (res[x][y - 1] == 0) res[x][y - 1] = 'R';
    return true;
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  int t;
  t = 1;
  for (; t > 0; t--) {
    cin >> n;
    for (int c = 0; c < n; c++)
      for (int c1 = 0; c1 < n; c1++)
        is_done[c][c1].first = is_done[c][c1].second = -1;
    for (int c = 0; c < n; c++) {
      vector<pair<int, int>> arr1;
      for (int c1 = 0; c1 < n; c1++) {
        int a;
        int b;
        cin >> a >> b;
        a--;
        b--;
        pair<int, int> temp = make_pair(a, b);
        arr1.push_back(temp);
      }
      arr.push_back(arr1);
    }
    for (int c(0); c < n; c++) {
      for (int c1 = 0; c1 < n; c1++) {
        if (arr[c][c1].first != -2) {
          res[arr[c][c1].first][arr[c][c1].second] = 'X';
          is_done[arr[c][c1].first][arr[c][c1].second].first = arr[c][c1].first;
          is_done[arr[c][c1].first][arr[c][c1].second].second =
              arr[c][c1].second;
          mark_them(arr[c][c1].first, arr[c][c1].second);
        }
      }
    }
    int flag = 0;
    for (int c = 0; c < n; c++) {
      for (int c1 = 0; c1 < n; c1++) {
        if (res[c][c1] == 0 && arr[c][c1].first == -2 && !valid(c, c1))
          flag = -1;
        else if (res[c][c1] == 0 ||
                 (res[c][c1] == 'X' && !pair_equal(is_done[c][c1], arr[c][c1])))
          flag = -1;
      }
    }
    if (flag == -1)
      cout << "INVALID" << endl;
    else {
      cout << "VALID" << endl;
      for (int c = 0; c < n; c++) {
        for (int c1 = 0; c1 < n; c1++) {
          cout << res[c][c1];
        }
        cout << endl;
      }
    }
  }
  return 0;
}
