#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 2e3 + 5;
const long long MOD = 1e9 + 7;
int n, m, a[MAXN], vis[MAXN], pre[MAXN];
vector<int> v[MAXN];
char mp[MAXN][MAXN];
struct node {
  int x, val;
} p;
queue<node> q;
int Find(int x) { return pre[x] == x ? x : pre[x] = Find(pre[x]); }
int main() {
  while (~scanf("%d%d", &n, &m)) {
    int flag = 0;
    memset(vis, 0, sizeof(vis));
    memset(a, 0, sizeof(a));
    for (long long i = 1; i <= n + m; i++) pre[i] = i;
    for (long long i = 1; i <= n; i++) {
      scanf("%s", mp[i] + 1);
    }
    for (long long i = 1; i <= n; i++) {
      for (long long j = 1; j <= m; j++) {
        if (mp[i][j] == '=') {
          int xx = Find(i), yy = Find(n + j);
          pre[xx] = yy;
        }
      }
    }
    for (long long i = 1; i <= n; i++) {
      for (long long j = 1; j <= m; j++) {
        if (mp[i][j] == '=') continue;
        int xx = Find(i), yy = Find(n + j);
        if (xx == yy) {
          flag = 1;
          break;
        }
        if (mp[i][j] == '<') {
          v[xx].push_back(yy);
          vis[yy]++;
        }
        if (mp[i][j] == '>') {
          v[yy].push_back(xx);
          vis[xx]++;
        }
      }
      if (flag) break;
    }
    if (flag) {
      puts("No");
      continue;
    }
    for (long long i = 1; i <= n; i++) {
      if (vis[i] == 0) {
        p.x = i, p.val = 1;
        q.push(p);
      }
    }
    for (long long i = 1; i <= m; i++) {
      if (vis[n + i] == 0) {
        p.x = n + i, p.val = 1;
        q.push(p);
      }
    }
    int tot = 0;
    while (!q.empty()) {
      tot++;
      p = q.front();
      q.pop();
      a[p.x] = p.val;
      int len = v[p.x].size();
      for (long long i = 0; i <= len - 1; i++) {
        int to = v[p.x][i];
        vis[to]--;
        if (!vis[to]) {
          node temp;
          temp.x = to, temp.val = p.val + 1;
          q.push(temp);
        }
      }
    }
    for (long long i = 1; i <= n + m; i++) {
      a[i] = a[Find(i)];
    }
    for (long long i = 1; i <= n; i++) {
      for (long long j = 1; j <= m; j++) {
        if ((mp[i][j] == '=' && a[i] == a[n + j]) ||
            (mp[i][j] == '>' && a[i] > a[n + j]) ||
            (mp[i][j] == '<' && a[i] < a[n + j]))
          flag = 0;
        else {
          flag = 1;
          break;
        }
      }
      if (flag) break;
    }
    if (flag)
      printf("No\n");
    else {
      printf("Yes\n");
      for (long long i = 1; i <= n + m; i++) {
        printf("%d", a[i]);
        if (i == n || i == n + m)
          cout << endl;
        else
          cout << " ";
      }
    }
  }
  return 0;
}
