import std.algorithm;
import std.array;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main() {
  int n, m;
  readf (" %d %d", &n, &m);
  int[] d = new int[n];
  auto e = new int[][] (n);
  foreach (k; 0 .. m) {
    int i, j;
    readf (" %d %d", &i, &j);
    --i; --j;
    d[i]++;
    d[j]++;
    e[i] ~= j;
    e[j] ~= i;
  }
  int[] a;
  bool[long] dt;
  long h (int i, int j) {
    if (i > j) swap (i, j);
    return (i.to!long << 32) + j;
  }
  bool isdel (int i, int j) {
    return (h(i,j) in dt) != null;
  }
  void del (int i, int j) {
    dt[h(i, j)] = true;
  }
  void euler (int i) {
    debug stderr.writefln ("euler %d", i);
    while (!e[i].empty) {
      int j = e[i][0];
      debug stderr.writefln ("j = %d", j);
      if (isdel (i, j)) {
        e[i][0] = e[i].back;
        e[i].popBack ();
        continue;
      }
      del (i, j);
      e[i][0] = e[i].back;
      e[i].popBack ();
      euler (j);
    }
    a ~= i;
  }
  foreach (i; 0 .. n) {
    if (d[i] & 1) {
      writeln ("No");
      return;
    }
  }
  euler (0);
  debug stderr.writeln("a = ", a);
  int k;
  auto pos = new int[n];
  pos[] = -1;
  Tuple!(int,int)[] t; 
  foreach_reverse (i; 0 .. a.length.to!int) {
    if (pos[a[i]] < 0) {
      pos[a[i]] = i;
    } else {
      t ~= tuple (i, pos[a[i]]);
      pos[a[i]] = -1;
    }
  }
  t.sort!"a[1] < b[1]" ();
  int last = -1;
  foreach (ref p; t) {
    if (p[0] <= last) continue;
    ++k;
    last = p[1];
  }
  debug stderr.writeln (k, ' ', d);
  writeln ((k >= 2) ? "Yes" : "No");
}

