#include<bits/stdc++.h>
#pragma GCC optimization ("Ofast")
#pragma GCC optimization ("unroll-loops")
using namespace std;
//#define int long long
#define rep(i,n) for(int i=0;i<n;i++)
#define REP(i,n) for(int i=1;i<n;i++)
#define rev(i,n) for(int i=n-1;i>=0;i--)
#define all(v) v.begin(),v.end()
#define P pair<int,int>
#define len(s) (int)s.size()
 
template<class T> inline bool chmin(T &a, T b){
	if(a>b){a=b;return true;}
	return false;
}
template<class T> inline bool chmax(T &a, T b){
	if(a<b){a=b;return true;}
	return false;
}
constexpr int mod = 1e9+7;
constexpr long long inf = 3e18;

struct Dinic{
	struct Edge{int to,cap,rev;};
	vector<vector<Edge>>G;
	vector<int>level,iter;
	void addEdge(int from,int to,int cap){
		G[from].push_back({to,cap,len(G[to])});
		G[to].push_back({from,0,len(G[from])-1});
	}
	void bfs(int s){
		fill(all(level),-1);
		level[s]=0;
		queue<int>que;que.push(s);
		while(len(que)){
			int p=que.front();que.pop();
			for(Edge e:G[p]){
				if(e.cap>0&&level[e.to]==-1){
					level[e.to]=level[p]+1;
					que.push(e.to);
				}
			}
		}
	}
	int dfs(int v,int t,int f){
		if(v==t)return f;
		for(int &i=iter[v];i<len(G[v]);i++){
			Edge &e=G[v][i];
			if(e.cap>0&&level[e.to]>level[v]){
				int d=dfs(e.to,t,min(f,e.cap));
				if(d>0){
					e.cap-=d;
					G[e.to][e.rev].cap+=d;
					return d;
				}
			}
		}
		return 0;
	}
	int maxFlow(int s,int t){
		int flow=0;
		while(1){
			bfs(s);
			if(level[t]<0)return flow;
			fill(all(iter),0);
			int f=0;
			while((f=dfs(s,t,mod))>0){
				flow+=f;
			}
		}
	}
	Dinic(int N):G(N),level(N),iter(N){}
};

int H,W;
char c[105][105];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char ans[105][105];
signed main(){
	cin.tie(0);ios::sync_with_stdio(false);
	cin>>H>>W;
	Dinic F(H*W+2);
	rep(i,H)rep(j,W){
		cin>>c[i][j];ans[i][j]=c[i][j];
		if((i+j)%2)F.addEdge(H*W,i*W+j,1);
		else F.addEdge(i*W+j,H*W+1,1);
	}
	rep(i,H)rep(j,W)if((i+j)%2&&c[i][j]=='.')rep(k,4){
		int nx=i+dx[k],ny=j+dy[k];
		if(nx<0||ny<0||nx>=H||ny>=W||c[nx][ny]=='#')continue;
		F.addEdge(i*W+j,nx*W+ny,1);
	}
	cout<<F.maxFlow(H*W,H*W+1)<<"\n";
	rep(i,H){
		rep(j,W){
			if(c[i][j]=='#'||(i+j)%2==0)continue;
			for(auto e:F.G[i*W+j])if(e.cap==0&&e.to/W<H){
				if(e.to/W==i-1){ans[i][j]='^';ans[i-1][j]='v';}
				else if(e.to/W==i+1){ans[i][j]='v';ans[i+1][j]='^';}
				else if(e.to%W==j-1){ans[i][j]='<';ans[i][j-1]='>';}
				else {ans[i][j]='>';ans[i][j+1]='<';}
				break;
			}
		}
	}
	rep(i,H){rep(j,W)cout<<ans[i][j];cout<<"\n";}
}