#include <bits/stdc++.h>
using namespace std;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
const int N = (int)1e5 + 7;
const int MOD = (int)1e9 + 7;
const int M = 501;
const int INF = 2e9;
const long long BIG = 1e18;
vector<vector<int> > g(N);
int n;
bool used[N], t[M][M];
bool valid(vector<int>& d) {
  int n = int(d.size());
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (i == j) continue;
      int v = d[i], to = d[j];
      if (t[v][to] == 0) return 0;
    }
  }
  return 1;
}
int main() {
  vector<int> a, b, c;
  int m;
  cin >> n >> m;
  while (m--) {
    int u, v;
    cin >> u >> v;
    t[u][v] = t[v][u] = 1;
    g[u].push_back(v);
    g[v].push_back(u);
    if (int(g[u].size()) == n - 1) b.push_back(u);
    if (int(g[v].size()) == n - 1) b.push_back(v);
  }
  for (auto x : b) {
    used[x] = 1;
  }
  int tv = -1;
  for (int i = 1; i <= n; i++)
    if (!used[i]) tv = i;
  if (tv == -1) {
    puts("Yes");
    for (int i = 0; i < n; i++) cout << 'b';
    return 0;
  }
  a.push_back(tv);
  used[tv] = 1;
  for (auto x : g[tv])
    if (!used[x]) a.push_back(x), used[x] = 1;
  for (int i = 1; i <= n; i++)
    if (!used[i]) c.push_back(i), used[i] = 1;
  vector<char> s(N);
  for (auto x : a) s[x] = 'a';
  for (auto x : b) s[x] = 'b';
  for (auto x : c) s[x] = 'c';
  if (!valid(a) || !valid(c)) {
    puts("No");
    return 0;
  }
  for (auto u : a) {
    for (auto v : c) {
      if (t[u][v]) {
        puts("No");
        return 0;
      }
    }
  }
  puts("Yes");
  for (int i = 1; i <= n; i++) cout << s[i];
  return 0;
}
