#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 10;
char s[MAXN][MAXN];
vector<int> G[MAXN << 1];
int indec[MAXN << 1];
int ans[MAXN << 1];
bool vis[MAXN << 1];
struct DSU {
  int p[MAXN << 1];
  int sz;
  void init(int n) {
    sz = n;
    for (int i = 1; i <= n; i++) {
      p[i] = i;
    }
  }
  int findp(int x) { return x == p[x] ? x : p[x] = findp(p[x]); }
  void unite(int x, int y) {
    x = findp(x);
    y = findp(y);
    if (x == y) return;
    sz--;
    p[x] = y;
  }
} dsu;
void dfs(int u) {
  vis[u] = true;
  for (auto v : G[u]) {
    ans[v] = max(ans[v], ans[u] + 1);
    indec[v]--;
    if (indec[v] == 0) {
      dfs(v);
    }
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  dsu.init(n + m);
  for (int i = 1; i <= n; i++) {
    scanf("%s", s[i] + 1);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (s[i][j] == '=') {
        dsu.unite(i, n + j);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      int x = dsu.findp(i);
      int y = dsu.findp(n + j);
      if (s[i][j] == '<') {
        if (x == y) {
          puts("No");
          return 0;
        }
        G[x].push_back(y);
        indec[y]++;
      } else if (s[i][j] == '>') {
        if (x == y) {
          puts("No");
          return 0;
        }
        G[y].push_back(x);
        indec[x]++;
      }
    }
  }
  for (int i = 1; i <= n + m; i++) {
    int x = dsu.findp(i);
    if (indec[x] == 0) {
      ans[x] = 1;
    }
  }
  for (int i = 1; i <= n + m; i++) {
    if (ans[i] == 1) {
      dfs(i);
    }
  }
  int cnt = 0;
  for (int i = 1; i <= n + m; i++) {
    if (vis[i]) {
      cnt++;
    }
  }
  if (cnt != dsu.sz) {
    puts("No");
    return 0;
  }
  puts("Yes");
  for (int i = 1; i <= n; i++) {
    printf("%d ", ans[dsu.findp(i)]);
  }
  puts("");
  for (int i = 1; i <= m; i++) {
    printf("%d ", ans[dsu.findp(n + i)]);
  }
  return 0;
}
