#include <cassert>
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
using std::cin; using std::cout;
using std::endl;
using std::bitset; using std::map;
using std::queue; using std::priority_queue;
using std::set; using std::string;
using std::stringstream; using std::vector;
using std::pair; using std::make_pair;
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
typedef pair<ULL, ULL> puu;
#ifdef DEBUG
using std::cerr;
#define pass cerr << "[" << __FUNCTION__ << "] : line = " << __LINE__ << endl;
#define display(x) cerr << #x << " = " << x << endl;
#define displaya(a, st, n)                      \
	{                                           \
		cerr << #a << " = {";                   \
		for (int qwq = (st); qwq <= (n); ++qwq) \
			if (qwq == (st))                    \
				cerr << a[qwq];                 \
			else                                \
				cerr << ", " << a[qwq];         \
		cerr << "}" << endl;                    \
	}
#define displayv(a) displaya(a, 0, (int)(a.size() - 1))
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#include <ctime>
class MyTimer {
	clock_t st;
public:
	MyTimer() { cerr << std::fixed << std::setprecision(0); reset(); }
	~MyTimer() { report(); }
	void reset() { st = clock_t(); }
	void report() {  cerr << "Time consumed: " << (clock() - st) * \
		1e3 / CLOCKS_PER_SEC << "ms" << endl; }
} myTimer;
#else
#define cerr if(false) std::cout
#define pass ;
#define display(x) ;
#define displaya(a, st, n) ;
#define displayv(a) ;
#define eprintf(...) if(0) fprintf(stderr, __VA_ARGS__)
class MyTimer {
public: void reset() {} void report() {}
} myTimer;
#endif

template<typename A, typename B>
std::ostream& operator << (std::ostream &cout, const pair<A, B> &x) {
	return cout << "(" << x.first << ", " << x.second << ")";
}
template<typename T1, typename T2>
inline bool chmin(T1 &a, const T2 &b) { return a > b ? a = b, true : false; }
template<typename T1, typename T2>
inline bool chmax(T1 &a, const T2 &b) { return a < b ? a = b, true : false; }

const int maxN = 100000 + 233;
int n, m, deg[maxN];
set<int> G[maxN];

void initialize() {
	std::ios::sync_with_stdio(false);
	cin >> n >> m;
	for(int i = 1; i <= m; ++i) {
		int x, y; cin >> x >> y;
		G[x].insert(y); G[y].insert(x);
		deg[x]++; deg[y]++;
	}
}

bool vis[maxN];
int x = -1, y = -1;
bool DFS(int u, int d) {
	vis[u] = true;
	if(u == x && d > 0) return true;
	while(G[u].size()) {
		int v = *G[u].begin();
		G[u].erase(v); G[v].erase(u);
		if(DFS(v, d + 1)) return true;
	}
	return false;
}

bool solve() {
	for(int u = 1; u <= n; ++u) if(deg[u] % 2 == 1) return false;
	vector<int> d(deg + 1, deg + n + 1);
	std::sort(d.begin(), d.end()); std::reverse(d.begin(), d.end());
	while(d.size() && d.back() == 2) d.pop_back();
	if(d.size() == 0) return false;
	if(d[0] >= 6) return true;
	if(d.size() == 1) return false;
	if(d.size() >= 3) return true;
	for(int u = 1; u <= n; ++u) if(deg[u] == 4) {
		if(x == -1) x = u; else y = u;
	}
	int cnt = 0;
	memset(vis, 0, sizeof(vis));
	DFS(x, 0);
	cnt += vis[y];
	memset(vis, 0, sizeof(vis));
	DFS(x, 0);
	cnt += vis[y];
	return cnt == 1;
}

int main() {
	initialize();
	if(solve()) cout << "Yes" << endl;
	else cout << "No" << endl;
	return 0;
}


Measured memory_bytes: 18304