#include <bits/stdc++.h>
#define pi acos(-1.0 )
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const int maxn =1000 + 10;
const LL mod = 1e9+7;
char s[maxn][maxn];
int par[maxn*2], ans[maxn*2], degree[maxn*2], vis[maxn*2];
vector<int> vec[maxn*2];
stack<int> stk;
int findr(int x)
{
return par[x]==x? x:findr(par[x]);
}
int unite(int x, int y)
{
x = findr(x);
y = findr(y);
if(x!=y) par[x] = y;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++){
scanf("%s", s[i]+1);
}
for(int i=1; i<=n+m; i++) par[i] = i;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
if(s[i][j] == '=') unite(i, j+n);
}
}
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++)
if(s[i][j] == '>'){
vec[findr(j+n)].push_back(findr(i)); degree[findr(i)]++;
}
else if(s[i][j] == '<') vec[findr(i)].push_back(findr(j+n)), degree[findr(j+n)]++;
}
for(int i=1; i<=n+m; i++){
if(degree[findr(i)] == 0) {
stk.push(findr(i)); vis[findr(i)] = 1;
ans[findr(i)] = 1;
}
}
int tmp;
while(!stk.empty()){
tmp = stk.top(); stk.pop();
for(int v: vec[tmp]){
degree[findr(v)]--;
if(degree[findr(v)] == 0 && !vis[findr(v)]){
stk.push(findr(v)); vis[findr(v)] = 1;
ans[findr(v)] = ans[findr(tmp)]+1;
}
}
}
for(int i=1; i<=n+m; i++){
if(!vis[findr(i)]) {
printf("No\n");
return 0;
}
}
printf("Yes\n");
for(int i=1; i<=n; i++) printf("%d%c", ans[findr(i)], " \n"[i==n]);
for(int i=1; i<=m; i++) printf("%d%c", ans[findr(i+n)], " \n"[i==m]);
}