#include <bits/stdc++.h>
using namespace std;
const int MX = 1e5 + 22;
vector<vector<int> > G(MX);
int N;
int arr[MX];
int M;
int ni[MX];
int vis[MX];
int ans[MX];
int dfs(int x, int j) {
  vis[x] = 1;
  int res = 1;
  ans[x] = j;
  for (int i = 0; i < G[x].size(); i++) {
    int ch = G[x][i];
    ni[ch]++;
  }
  for (int i = 0; i < G[x].size(); i++) {
    int ch = G[x][i];
    if (!vis[ch] && G[ch].size() != N - 1) res += dfs(ch, j);
  }
  return res;
}
int main() {
  memset(ans, -1, sizeof ans);
  cin >> N >> M;
  int head;
  for (int i = 0; i < M; i++) {
    int a, b;
    cin >> a >> b;
    G[a].push_back(b);
    G[b].push_back(a);
    head = a;
  }
  for (int i = 1; i < N + 1; i++) {
    sort(G[i].begin(), G[i].end());
    G[i].resize(unique(G[i].begin(), G[i].end()) - G[i].begin());
  }
  int j = 0;
  for (int i = 1; i <= N; i++) {
    if (G[i].size() == N - 1) ans[i] = 1;
  }
  for (int i = 1; i <= N; i++) {
    if (vis[i] || ans[i] == 1) continue;
    int d = dfs(i, j);
    j++;
    if (j == 1) j++;
    int mx = ni[i];
    for (int j = 0; j < G[i].size(); j++) {
      if (G[G[i][j]].size() != N - 1) mx = min(mx, ni[G[i][j]]);
    }
    if (d - 1 != mx) {
      cout << "No\n";
      return 0;
    }
  }
  for (int i = 1; i <= N; i++) {
    if (ans[i] > 2) {
      cout << "No\n";
      return 0;
    }
  }
  cout << "Yes\n";
  for (int i = 1; i <= N; i++) cout << char(ans[i] + 'a');
  return 0;
}
