def main(): n, m = map(int, input().split()) if n - 1 != m: return "No" node = [[] for _ in range(n)] V = [0] * n C = set() for _ in range(m): u, v = [int(x)-1 for x in input().split()] node[u].append(v) node[v].append(u) V[u] += 1 V[v] += 1 C.add((u, v)) C.add((v, u)) v_ = max(V) if v_ != 3: return "No" V_ = V[:] L = [0] * 4 for v in V: L[v] += 1 line = [] edge = [] S = [i for i in range(n) if V_[i] <= 1] E = [1] * n while S: now = S.pop() if not V_[now]: line.append(E[now]) continue for nxt in node[now]: if V_[nxt] == 0: continue elif V_[nxt] == 3: V_[now] -= 1 edge.append(E[now]) else: V_[now] -= 1 V_[nxt] -= 1 E[nxt] += E[now] if V_[nxt] == 1: S.append(nxt) line.sort() edge.sort() f = 0 I = [] for i in range(n): v = V_[i] if v == 2: I.append(i) f += 1 if f > 2: return "No" elif f == 2: if not line and L[1] == L[3] + 2 and not (I[0], I[1]) in C: return "Yes" else: return "No" elif f == 1: if len(line) == 1 and edge and line[0] == edge[0] == edge[-1]: return "Yes" elif len(line) == 1 and edge and line[0] == edge[0] * 2 + 1 == edge[-1] * 2 + 1: return "Yes" elif not line and edge and edge[-1]-1 == max(edge[:-1]) == min(edge[:-1]): return "Yes" else: return "No" if len(line) > 2: return "No" elif len(line) == 2: if line[0] == line[1] and line[0] % 2: t = line[0] // 2 edge_ = edge[:] + [t, t, t, t] if L[1] == L[3] + 2 and min(edge_) == max(edge_): return "Yes" else: return "No" elif line[0] * 2 + 1 == line[1]: t = line[0] edge_ = edge[:] + [t, t, t] if L[0] and L[1] == L[3] and min(edge_) == max(edge_): return "Yes" elif L[1] - 2 == L[3] and min(edge_) == max(edge_): return "Yes" else: return "No" else: return "No" elif line: if not edge: return "No" elif edge[-1] - 1 == line[0] == edge[-2] == edge[0]: return "Yes" else: edge[0] += line[0] if not L[0]: L[1] -= 2 if L[1] == L[3] and min(edge) == max(edge): return "Yes" else: return "No" else: if L[1] - 2 != L[3] or len(edge) <= 2: return "No" else: edge[-1] -= 1 edge[-2] -= 1 if min(edge) == max(edge): return "Yes" else: return "No" print(main())