#include <bits/stdc++.h>
using namespace std;
char g[2100][2100];
int i, j, n, m;
int dir[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
int d[2100][2100];
queue<pair<int, int> > q;
void Build() {
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (g[i][j] == '.') {
        if (i > 1 && g[i - 1][j] == '.') d[i][j]++;
        if (i < n && g[i + 1][j] == '.') d[i][j]++;
        if (j > 1 && g[i][j - 1] == '.') d[i][j]++;
        if (j < m && g[i][j + 1] == '.') d[i][j]++;
        if (d[i][j] == 1) q.push({i, j});
      }
}
void Adj(int xx, int yy) {
  int i, x, y;
  for (i = 0; i < 4; i++) {
    x = xx + dir[i][0];
    y = yy + dir[i][1];
    d[x][y]--;
    if (d[x][y] == 1) q.push({x, y});
  }
}
void Topsort() {
  pair<int, int> u;
  int x, y, i, j;
  while (!q.empty()) {
    u = q.front();
    q.pop();
    x = u.first;
    y = u.second;
    if (g[x - 1][y] == '.') {
      g[x - 1][y] = '^';
      g[x][y] = 'v';
      Adj(x - 1, y);
    } else if (g[x + 1][y] == '.') {
      g[x][y] = '^';
      g[x + 1][y] = 'v';
      Adj(x + 1, y);
    } else if (g[x][y + 1] == '.') {
      g[x][y] = '<';
      g[x][y + 1] = '>';
      Adj(x, y + 1);
    } else if (g[x][y - 1] == '.') {
      g[x][y] = '>';
      g[x][y - 1] = '<';
      Adj(x, y - 1);
    } else if (g[x][y] == '.') {
      printf("Not unique\n");
      return;
    }
  }
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (g[i][j] == '.') {
        printf("Not unique\n");
        return;
      }
  for (i = 1; i <= n; i++) printf("%s\n", g[i] + 1);
}
int main() {
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%s", g[i] + 1);
  Build();
  Topsort();
  return 0;
}
