import sys
sys.path.append("/home/contestant/.local/lib/python3.8/site-packages")
import networkx as nx
R, C = [int(x) for x in input().split()]
grid = [list(input()) for r in range(R)]
def pack(r, c):
return r * C + c
graph = nx.Graph()
top_nodes = set() # top half of the bipartite graph
for r in range(R):
for c in range(C):
if r + 1 < R and grid[r][c] == grid[r + 1][c] == ".":
u, v = pack(r, c), pack(r + 1, c)
graph.add_edge(u, v)
if (r + c) % 2 == 0:
top_nodes.add(v)
else:
top_nodes.add(u)
if c + 1 < C and grid[r][c] == grid[r][c + 1] == ".":
u, v = pack(r, c), pack(r, c + 1)
graph.add_edge(u, v)
if (r + c) % 2 == 0:
top_nodes.add(v)
else:
top_nodes.add(u)
matching = nx.bipartite.maximum_matching(graph, top_nodes=top_nodes)
count = 0
for u, v in matching.items():
if u > v:
assert matching[v] == u
r1, c1 = divmod(u, C)
r2, c2 = divmod(v, C)
if r1 == r2:
if c1 > c2:
c1, c2 = c2, c1
grid[r1][c1], grid[r2][c2] = ">", "<"
elif c1 == c2:
if r1 > r2:
r1, r2 = r2, r1
grid[r1][c1] = "v"
grid[r2][c2] = "^"
count += 1
print(count)
for row in grid:
print("".join(row))