#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define all(c) c.begin(),c.end()
#define pb push_back
#define fs first
#define sc second
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
using namespace std;
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){
	return o<<"("<<p.fs<<","<<p.sc<<")";
}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){
	o<<"{";
	for(const T& v:vc) o<<v<<",";
	o<<"}";
	return o;
}
using ll = long long;
template<class T> using V = vector<T>;
template<class T> using VV = vector<vector<T>>;
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n-1); }

#ifdef LOCAL
#define show(x) cerr << "LINE" << __LINE__ << " : " << #x << " = " << (x) << endl
#else
#define show(x) true
#endif

template<class E>
struct Articulation{
	using P = pair<int,E>;
	using VP = vector<P>;

	//in
	vector<vector<E>> G;

	//out
	vector<int> arts;
	vector<VP> biedges;

	//out(ConstructGraphAB)
	vector<vector<int>> GraphAB;


	//tmp
	vector<int> ord,low;
	int I;
	stack<P> st;

	Articulation(const vector<vector<E>>& G):G(G){	//calc arts,biedges
		int N = G.size();
		ord.assign(N,0);
		low.assign(N,0);
		I = 0;

		rep(i,N) if(ord[i]==0){
			while(!st.empty()) st.pop();
			dfs(i);
		}
	}

	void ConstructGraphAB(){
		int A = arts.size();		//[0,A)
		int B = biedges.size();		//[A,A+B)
		GraphAB.resize(A+B);

		int N = G.size();
		vector<int> a2id(N,-1);
		rep(i,A){
			a2id[arts[i]] = i;
		}

		rep(b,B){
			vector<int> vc;
			for(P p:biedges[b]){
				int from = p.fs;
				int to = p.sc.to;
				if(a2id[from]!=-1){
					vc.pb(a2id[from]);
				}
				if(a2id[to]!=-1){
					vc.pb(a2id[to]);
				}
			}
			sort(all(vc));
			vc.erase(unique(vc.begin(),vc.end()),vc.end());
			for(int v:vc){
				GraphAB[A+b].pb(v);
				GraphAB[v].pb(A+b);
			}
		}
	}

	void dfs(int v,int p = -1){
		ord[v]=++I;
		low[v]=ord[v];
		int c=0;
		bool isart=0;
		for(auto& e:G[v]) if(e.to!=p){
			int u = e.to;
			if(ord[u]<ord[v]) st.push(P(v,e));
			if(ord[u]) chmin(low[v],ord[u]);	//back edge
			else{
				dfs(u,v);
				c++;
				chmin(low[v],low[u]);
				if(low[u]>=ord[v]){
					isart = 1;
					vector<P> vp;
					while(true){
						P p=st.top();st.pop();
						vp.pb(p);
						if(p.fs==v && p.sc.to==u) break;
					}
					biedges.pb(vp);
				}
			}
		}
		if(p<0) isart=(c>1);
		if(isart) arts.pb(v);
	}
	
};
struct Edge{
	int to;
	friend ostream& operator<<(ostream& o,const Edge& e){return o<<e.to;}
};


void Answer(bool b){
	if(b) cout << "Yes" << endl;
	else cout << "No" << endl;
	exit(0);
	return;
}

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);		//DON'T USE scanf/printf/puts !!
	cout << fixed << setprecision(20);
	
	int N,M;
	cin >> N >> M;
	VV<Edge> G(N);
	rep(i,M){
		int x,y;
		cin >> x >> y;
		x--,y--;
		G[x].pb({y});
		G[y].pb({x});
	}
	rep(i,N){
		if(G[i].size()%2 == 1){
			Answer(false);
		}
	}

	int cnt = 0;
	int mx = 0;
	rep(i,N){
		if(G[i].size() > 2) cnt++;
		chmax(mx,(int)G[i].size());
	}
	if(cnt > 2){
		Answer(true);
	}
	if(cnt == 0) Answer(false);
	if(cnt == 1){
		if(mx>=6) Answer(true);
		Answer(false);
	}

	Articulation<Edge> art(G);
	if(art.arts.empty()) Answer(false);
	Answer(true);

}


Measured memory_bytes: 25976