#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const int MOD = 1e9 + 7;
const int MAXN = 1e6 + 3;
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
long long power(long long x, long long y) {
  long long res = 1;
  while (y > 0) {
    if (y & 1) res = res * x;
    y = y >> 1;
    x = x * x;
  }
  return res;
}
long long n, m;
const int maxn = 1005;
vector<long long> parent(2 * maxn);
vector<long long> sz(2 * maxn);
string s[maxn];
vector<long long> adj[2 * maxn];
vector<long long> clr(2 * maxn);
vector<long long> depth(2 * maxn, 0);
void makeset(long long v) {
  parent[v] = v;
  sz[v] = 1;
  return;
}
long long getset(long long v) {
  while (parent[v] != v) v = parent[v];
  return v;
}
void uset(long long x, long long y) {
  x = getset(x);
  y = getset(y);
  if (x != y) {
    if (sz[x] < sz[y]) {
      x = x + y;
      y = x - y;
      x = x - y;
    };
    sz[x] += sz[y];
    parent[y] = x;
  }
  return;
}
bool dfs(long long u) {
  if (clr[u] == 2) return false;
  clr[u] = 1;
  long long mx = 0;
  for (auto v : adj[u]) {
    if (clr[v] == 0) {
      if (dfs(v)) return true;
      mx = max(depth[v], mx);
    } else if (clr[v] == 1) {
      return true;
    } else if (clr[v] == 2) {
      mx = max(depth[v], mx);
      continue;
    }
  }
  clr[u] = 2;
  depth[u] = max(depth[u], mx + 1);
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m;
  for (long long i = 0; i < (n + m); ++i) {
    makeset(i);
  }
  for (long long i = 0; i < (n); ++i) cin >> s[i];
  for (long long i = 0; i < (n); ++i) {
    for (long long j = 0; j < (m); ++j) {
      if (s[i][j] == '=') uset(getset(i), getset(n + j));
    }
  }
  for (long long i = 0; i < (n); ++i) {
    for (long long j = 0; j < (m); ++j) {
      if (s[i][j] == '>') {
        adj[getset(i)].push_back(getset(n + j));
      } else if (s[i][j] == '<') {
        adj[getset(n + j)].push_back(getset(i));
      }
    }
  }
  for (long long i = 0; i < (n + m); ++i) {
    if (dfs(getset(i))) {
      cout << "No\n";
      return 0;
    }
  }
  cout << "Yes\n";
  for (long long i = 0; i < (n); ++i) {
    cout << depth[getset(i)] << " ";
  }
  cout << '\n';
  for (long long i = 0; i < (m); ++i) {
    cout << depth[getset(i + n)] << " ";
  }
  cout << '\n';
  return 0;
}
