#include <bits/stdc++.h>
using namespace std;
template <typename T>
void pr(vector<T> &v) {
  for (int i = 0; i < (int)(v).size(); i++) cout << v[i] << " ";
  cout << '\n';
  ;
}
template <typename T>
void pr(vector<vector<T>> &v) {
  for (int i = 0; i < (int)(v).size(); i++) {
    pr(v[i]);
  }
}
template <typename T>
void re(T &x) {
  cin >> x;
}
template <typename T>
void re(vector<T> &a) {
  for (int i = 0; i < (int)(a).size(); i++) re(a[i]);
}
template <class Arg, class... Args>
void re(Arg &first, Args &...rest) {
  re(first);
  re(rest...);
}
template <typename T>
void pr(T x) {
  cout << x << '\n';
  ;
}
template <class Arg, class... Args>
void pr(const Arg &first, const Args &...rest) {
  cout << first << " ";
  pr(rest...);
  cout << '\n';
  ;
}
void ps() {
  cout << '\n';
  ;
}
template <class T, class... Ts>
void ps(const T &t, const Ts &...ts) {
  cout << t;
  if (sizeof...(ts)) cout << " ";
  ps(ts...);
}
int n;
vector<vector<pair<int, int>>> g;
vector<vector<char>> ans;
bool connect(int p, int q, int r, int s, char c1, char c2) {
  if (g[r][s].second < 0) {
    ans[r][s] = c2;
    if (ans[p][q] == '0') ans[p][q] = c1;
    return true;
  }
  return false;
}
void dfs(int p, int q, char d) {
  if (ans[p][q] != '0') return;
  ans[p][q] = d;
  if (g[p][q].first == g[p + 1][q].first &&
      g[p][q].second == g[p + 1][q].second) {
    dfs(p + 1, q, 'U');
  }
  if (g[p][q].first == g[p - 1][q].first &&
      g[p][q].second == g[p - 1][q].second) {
    dfs(p - 1, q, 'D');
  }
  if (g[p][q].first == g[p][q + 1].first &&
      g[p][q].second == g[p][q + 1].second) {
    dfs(p, q + 1, 'L');
  }
  if (g[p][q].first == g[p][q - 1].first &&
      g[p][q].second == g[p][q - 1].second) {
    dfs(p, q - 1, 'R');
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n;
  re(n);
  g.resize(n + 5, vector<pair<int, int>>(n + 5, {INT_MAX, INT_MAX}));
  ans.resize(n + 5, vector<char>(n + 5, '0'));
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < n + 1; j++) {
      int x, y;
      cin >> x >> y;
      g[i][j] = {x, y};
    }
  }
  vector<int> x = {0, 0, -1, 1};
  vector<int> y = {1, -1, 0, 0};
  vector<char> x1 = {'R', 'L', 'U', 'D'};
  vector<char> y1 = {'L', 'R', 'D', 'U'};
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < n + 1; j++) {
      if (g[i][j].second < 0) {
        bool connected = (ans[i][j] != '0');
        int k = 0;
        while (!connected && k < 4) {
          connected = connect(i, j, i + x[k], j + y[k], x1[k], y1[k]);
          k++;
        }
        if (!connected) {
          pr("INVALID");
          return 0;
        }
      }
      if (g[i][j].first == i && g[i][j].second == j) {
        dfs(i, j, 'X');
      }
    }
  }
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < n + 1; j++) {
      if (ans[i][j] == '0') {
        cout << "INVALID" << '\n';
        ;
        return 0;
      }
    }
  }
  cout << "VALID" << '\n';
  ;
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < n + 1; j++) {
      cout << ans[i][j];
    }
    cout << '\n';
    ;
  }
}
