#include <bits/stdc++.h>
using namespace std;
const int maxn = 1111;
struct Edge {
  int to, next, val;
};
Edge edge[maxn * maxn];
int head[maxn << 1], vis[maxn << 1], dis[maxn << 1], cnt;
int fin[maxn << 1];
int n, m;
int f[maxn << 1];
int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); }
void merge(int x, int y) {
  x = find(x);
  y = find(y);
  f[y] = x;
}
void init() {
  memset(head, -1, sizeof(head));
  memset(vis, 0, sizeof(vis));
  memset(fin, 0, sizeof(fin));
  for (int i = 1; i <= n + m; i++) f[i] = i, dis[i] = 1;
  cnt = 0;
}
void addedge(int u, int v, int val) {
  edge[cnt].to = v;
  edge[cnt].val = val;
  edge[cnt].next = head[u];
  head[u] = cnt++;
}
char s[maxn][maxn];
int main() {
  while (scanf("%d%d", &n, &m) == 2) {
    init();
    bool judge = 1;
    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] == '=') merge(i, j + n);
    for (int i = 1; judge && i <= n; i++)
      for (int j = 1; judge && j <= m; j++) {
        int fi = find(i);
        int fj = find(j + n);
        if (s[i][j] == '<') {
          if (fi == fj) {
            judge = 0;
            break;
          } else {
            addedge(fi, fj, 1);
            fin[fj]++;
          }
        } else if (s[i][j] == '>') {
          if (fi == fj) {
            judge = 0;
            break;
          } else {
            addedge(fj, fi, 1);
            fin[fi]++;
          }
        }
      }
    if (!judge) {
      printf("No\n");
      continue;
    }
    queue<int> q;
    for (int i = 1; i <= n + m; i++) {
      int v = find(i);
      if (vis[v]) {
        vis[i] = 1;
        continue;
      }
      if (!fin[v]) q.push(v);
      vis[i] = vis[v] = 1;
    }
    while (!q.empty()) {
      int v = q.front();
      q.pop();
      for (int i = head[v]; i + 1; i = edge[i].next) {
        int to = edge[i].to;
        fin[to]--;
        if (!fin[to]) {
          q.push(to);
          dis[to] = dis[v] + 1;
        }
      }
    }
    for (int i = 1; i <= m + n; i++)
      if (fin[i]) {
        judge = 0;
        break;
      }
    if (!judge)
      printf("No\n");
    else {
      for (int i = 1; i <= n + m; i++) dis[i] = dis[find(i)];
      printf("Yes\n");
      printf("%d", dis[1]);
      for (int i = 2; i <= n; i++) printf(" %d", dis[i]);
      printf("\n%d", dis[n + 1]);
      for (int i = n + 2; i <= n + m; i++) printf(" %d", dis[i]);
      printf("\n");
    }
  }
}
