#include <bits/stdc++.h>
using namespace std;
const int MAX = 1002;
int n, m;
char table[MAX][MAX];
struct UnionFind {
  int n, p[2 * MAX], w[2 * MAX];
  UnionFind(int _n) {
    n = _n;
    for (int i = 0; i < n; i++) w[i] = 1;
    for (int i = 0; i < n; i++) p[i] = i;
  }
  void uni(int i, int j) {
    int u = root(i), v = root(j);
    if (u == v) return;
    if (w[u] > w[v]) {
      p[v] = u;
      w[u] += w[v];
    } else {
      p[u] = v;
      w[v] += w[u];
    }
  }
  bool connected(int i, int j) {
    int u = root(i), v = root(j);
    if (u == v)
      return true;
    else
      return false;
  }
  int root(int k) {
    while (p[k] != k) k = p[k];
    return k;
  }
} uf(2 * MAX);
vector<int> adj[2 * MAX];
int val[2 * MAX], outdeg[2 * MAX];
bool comp[2 * MAX], cycle;
void dfs(int v, int k) {
  val[v] = k;
  comp[v] = false;
  for (int w : adj[v]) {
    if (val[w] <= val[v] && comp[w])
      dfs(w, k + 1);
    else if (!comp[w]) {
      cycle = true;
      return;
    }
  }
  comp[v] = true;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) cin >> table[i][j];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (table[i][j] == '=') uf.uni(i, j + n);
  memset(outdeg, 0, sizeof(outdeg));
  for (int i = 0; i < m + n; i++) comp[i] = true;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      int u = uf.root(i), v = uf.root(j + n);
      if (table[i][j] == '<') {
        adj[u].push_back(v);
        outdeg[v]++;
      }
      if (table[i][j] == '>') {
        adj[v].push_back(u);
        outdeg[u]++;
      }
    }
  for (int i = 0; i < m + n; i++) val[i] = 1;
  vector<int> s;
  for (int i = 0; i < m + n; i++)
    if (outdeg[i] == 0 && adj[i].size() > 0) s.push_back(i);
  if (s.size() == 0) {
    s.push_back(uf.root(0));
  }
  for (int i : s) dfs(i, 1);
  if (cycle) {
    cout << "No";
    return 0;
  }
  cout << "YES\n";
  for (int i = 0; i < n; i++) cout << val[uf.root(i)] << " ";
  cout << "\n";
  for (int i = 0; i < m; i++) cout << val[uf.root(i + n)] << " ";
  return 0;
}
