#include <bits/stdc++.h>
using namespace std;
int n, m;
char M[2005][2005];
int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};
int N[2005][2005];
int cnt[2];
queue<pair<int, int> > Q;
bool valid(int x, int y) { return x >= 0 && y >= 0 && x < n && y < m; }
bool check(int x, int y, int op) {
  for (int(i) = (0); (i) < (4); (i)++) {
    int nx = x + dx[i];
    int ny = y + dy[i];
    if (valid(nx, ny)) N[nx][ny] += op;
  }
  return true;
}
void add(int x, int y) {
  for (int(i) = (0); (i) < (4); (i)++) {
    int nx = x + dx[i];
    int ny = y + dy[i];
    if (valid(nx, ny) && M[nx][ny] == '.' && N[nx][ny] == 1)
      Q.push(make_pair(nx, ny));
  }
}
void pross(int x, int y) {
  for (int(i) = (0); (i) < (4); (i)++) {
    int nx = x + dx[i];
    int ny = y + dy[i];
    if (valid(nx, ny) && M[nx][ny] == '.') {
      if (x == nx) {
        if (y < ny)
          M[x][y] = '<', M[nx][ny] = '>';
        else
          M[x][y] = '>', M[nx][ny] = '<';
      } else {
        if (x < nx)
          M[x][y] = '^', M[nx][ny] = 'v';
        else
          M[x][y] = 'v', M[nx][ny] = '^';
      }
      cnt[0]--;
      cnt[1]--;
      check(nx, ny, -1);
      add(nx, ny);
      return;
    }
  }
}
int main() {
  scanf("%d%d", &(n), &(m));
  for (int(i) = (0); (i) < (n); (i)++) scanf("%s", &M[i]);
  for (int(i) = (0); (i) < (n); (i)++)
    for (int(j) = (0); (j) < (m); (j)++)
      if (M[i][j] == '.') {
        check(i, j, 1);
        cnt[(i & 1) ^ (j & 1)]++;
      }
  if (cnt[0] != cnt[1])
    puts("Not unique");
  else {
    for (int(i) = (0); (i) < (n); (i)++)
      for (int(j) = (0); (j) < (m); (j)++)
        if (M[i][j] == '.' && N[i][j] == 1) Q.push(make_pair(i, j));
    while (!Q.empty()) {
      pair<int, int> q = Q.front();
      Q.pop();
      if (M[q.first][q.second] != '.') continue;
      pross(q.first, q.second);
    }
    if (cnt[0])
      puts("Not unique");
    else {
      for (int(i) = (0); (i) < (n); (i)++) printf("%s\n", M[i]);
    }
  }
}
