#include <bits/stdc++.h>
using namespace std;

class BipartiteMatching {
private:
  struct edge {
    int to, cap, rev;
  };
  int U, V;
  vector<vector<edge>> G;
  vector<int> level;
  vector<int> iter;
public:
  BipartiteMatching(int u, int v) : U(u), V(v), G(U + V + 2) {
    for (int i = 0; i < U; i++) {
      init_edge(0, i + 1);
    }
    for (int i = 0; i < V; i++) {
      init_edge(U + i + 1, U + V + 1);
    }
  }
  void init_edge(int from, int to) {
    G.at(from).push_back((edge) {to, 1, (int) G.at(to).size()});
    G.at(to).push_back((edge) {from, 0, (int) G.at(from).size() - 1});
  }
  void add(int from, int to) {
    from += 1, to += U + 1;
    G.at(from).push_back((edge) {to, 1, (int) G.at(to).size()});
    G.at(to).push_back((edge) {from, 0, (int) G.at(from).size() - 1});
  }
  void bfs(int s) {
    fill(level.begin(), level.end(), -1);
    queue<int> que;
    level.at(s) = 0;
    que.push(s);
    while (!que.empty()) {
      int v = que.front();
      que.pop();
      for (auto &e : G.at(v)) {
        if (e.cap > 0 && level.at(e.to) < 0) {
          level.at(e.to) = level.at(v) + 1;
          que.push(e.to);
        }
      }
    }
  }
  int dfs(int v, int t, int f) {
    if (v == t) {
      return f;
    }
    for (int &i = iter.at(v); i < (int) G.at(v).size(); i++) {
      edge &e = G.at(v).at(i);
      if (e.cap > 0 && level.at(v) < level.at(e.to)) {
        int d = dfs(e.to, t, min(f, e.cap));
        if (d > 0) {
          e.cap -= d;
          G.at(e.to).at(e.rev).cap += d;
          return d;
        }
      }
    }
    return 0;
  }
  int solve() {
    level.resize(U + V + 2),  iter.resize(U + V + 2);
    int flow = 0;
    int s = 0, t = U + V + 1;
    for (;;) {
      bfs(s);
      if (level.at(t) < 0) return flow;
      fill(iter.begin(), iter.end(), 0);
      int f;
      while ((f = dfs(s, t, numeric_limits<int>::max())) > 0) {
        flow += f;
      }
    }
  }
  vector<int> allocate() {
    vector<int> res(U, -1);
    for (int i = 0; i < U; i++) {
      for (auto &e : G.at(i + 1)) {
        if (e.cap == 0 && e.to != 0) {
          res.at(i) = e.to - U - 1;
          break;
        }
      }
    }
    return res;
  }
};

// BipartiteMatching BM(N, M); … N, M: マッチングするそれぞれの要素数
// BM.add(i, j); … 候補を繋げる。意図せず双方向に繋がないように注意する
// BM.solve() … 最大マッチング数
// BM.allocate() … solve() の後に実行するとiに割り当てられたjのindexを返す(無ければ-1)

int main() {
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  int H, W;
  cin >> H >> W;
  vector<vector<pair<char, int>>> S(H, vector<pair<char, int>>(W));
  int cnt = 0;
  for (int i = 0, cnt1 = 0, cnt2 = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      char c;
      cin >> c;
      if (c == '.') cnt++;
      if (i % 2 == 0 && j % 2 == 0) S.at(i).at(j) = {c, cnt1++};
      if (i % 2 == 0 && j % 2 == 1) S.at(i).at(j) = {c, cnt2++};
      if (i % 2 == 1 && j % 2 == 0) S.at(i).at(j) = {c, cnt2++};
      if (i % 2 == 1 && j % 2 == 1) S.at(i).at(j) = {c, cnt1++};
    }
  }
  BipartiteMatching BM((H * W + 1) / 2, H * W / 2);
  vector<int> mh(4), mw(4);
  mh = {-1, 0, 1, 0};
  mw = {0, 1, 0, -1};
  for (int h = 0; h < H; h++) {
    for (int w = 0; w < W; w++) {
      for (int i = 0; i < 4; i++) {
        int nh = h + mh.at(i);
        int nw = w + mw.at(i);
        if (nh < 0 || nh >= H || nw < 0 || nw >= W) continue;
        if (S.at(h).at(w).first == '#') continue;
        if (S.at(nh).at(nw).first == '#') continue;
        if (h % 2 == 0 && w % 2 == 1) continue;
        if (h % 2 == 1 && w % 2 == 0) continue;
        BM.add(S.at(h).at(w).second, S.at(nh).at(nw).second);
      }
    }
  }
  cout << BM.solve() << "\n";
  auto A = BM.allocate();
  for (int h = 0; h < H; h++) {
    for (int w = 0; w < W; w++) {
      for (int i = 0; i < 4; i++) {
        int nh = h + mh.at(i);
        int nw = w + mw.at(i);
        if (nh < 0 || nh >= H || nw < 0 || nw >= W) continue;
        if (h % 2 == 0 && w % 2 == 1) continue;
        if (h % 2 == 1 && w % 2 == 0) continue;
        if (S.at(nh).at(nw).second == A.at(S.at(h).at(w).second)) {
          if (i == 0) S.at(h).at(w).first = '^', S.at(nh).at(nw).first = 'v';
          if (i == 1) S.at(h).at(w).first = '>', S.at(nh).at(nw).first = '<';
          if (i == 2) S.at(h).at(w).first = 'v', S.at(nh).at(nw).first = '^';
          if (i == 3) S.at(h).at(w).first = '<', S.at(nh).at(nw).first = '>';
        } 
      }
    }
  }
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cout << S.at(i).at(j).first;
    }
    cout << "\n";
  }
}

Measured memory_bytes: 5060