/*
 * 	The way if it's all predetermined
 * 		And the way i should go all my life
 * 			I swear to go wherever will be
 * 				'Cause there'll be something to see and to find
 * 	I don't know the meaning of life
 * 		But i know what's truly precious
 * 			The way it's leading me to be in love
 * 				No fear i can find me always in my heart
 * 	The life it's not for comparing things
 * 		So i hold both of light and shadow
 * 			The rays of stars will bring me to you
 * 				Throught the dark night skies
 * 					See the way to be shined
 * 	I dont know what's right for our lives
 * 		But i know the truth of my love
 * 			The way it feels our breaths at the wind
 * 				And the way i should go all my life
 * 					I swear to go wherever will be
 * 						Thus the grace i wouldn't have
 * 							Will always in my heart
 * 								Thus the grace i wouldn't have
 * 									Will always in my heart
 */
#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#ifndef rd
#define endl '\n'
#endif
#ifdef rd
#define trace(...) cout<<"Line:"<<__LINE__<<" "; __f(#__VA_ARGS__, __VA_ARGS__)
template<typename Arg1>
void __f(const char* name, Arg1&& arg1) {
	cout<<name<<" : "<<arg1<<endl;
}
template<typename Arg1, typename ... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
	const char* comma=strchr(names+1,',');
	cout.write(names,comma-names)<<" : "<<arg1<<" | ";
	__f(comma+1,args...);
}
#else
#define trace(...)
#endif
#define deb cout<<"Line: "<<__LINE__<<" plz "
#define pb push_back
#define fi first
#define se second
#define int long long
typedef long long ll;
typedef long double f80;
#define double long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define sz(x) ((long long)x.size())
#define fr(a,b,c) for(int a=b; a<=c; a++)
#define rep(a,b,c) for(int a=b; a<c; a++)
#define trav(a,x) for(auto &a:x)
#define all(con) con.begin(),con.end()
const ll infl=2e18;
const int infi=2e9;
const int mod=1e9+7;
typedef vector<int> vi;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> oset;
mt19937 rang(chrono::high_resolution_clock::now().time_since_epoch().count());
auto clk=clock();
int rng(int lim) {
	uniform_int_distribution<int> uid(0,lim-1);
	return uid(rang);
}

int deg[100006];
vi gra[100005];
bool vis[100005];
void dfs(int fr, int at,int starter, int notvisit) {
	trace(fr,at,starter,notvisit);
	vis[at]=1;
	for(int i:gra[at]) {
		if(i!=fr&&i==starter) {
			cout<<"Yes"<<endl;
			exit(0);
		}
		if(!vis[i]&&i!=notvisit) {
			dfs(at,i,starter,notvisit);
		}
	}
}
void solve() {
	int n,m,u,v;
	cin>>n>>m;
	if(m<n+2) {
		cout<<"No"<<endl;
		return;
	}
	fr(i,1,m) {
		cin>>u>>v;
		deg[u]++;
		deg[v]++;
		gra[u].pb(v);
		gra[v].pb(u);
	}
	int moretwo=0,moreone=0;
	vi four;
	fr(i,1,n) {
		if(deg[i]&1) {
			cout<<"No"<<endl;
			return;
		}
		if(deg[i]>4) {
			moretwo++;
		} else if(deg[i]==4)
		{
			four.pb(i);
			moreone++;
		}
	}
	if(moretwo>0)
		cout<<"Yes"<<endl;
	else if(moreone>2)
		cout<<"Yes"<<endl;
	else
	{
		dfs(four[0],four[0],four[0],four[1]);
		fill(vis+1,vis+n+1,0);
		dfs(four[1],four[1],four[1],four[0]);
		cout<<"No"<<endl;
	}
}
signed main() {
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	srand(chrono::high_resolution_clock::now().time_since_epoch().count());
	int t=1;
//	cin>>t;
	while(t--)
		solve();
#ifdef rd
	cerr<<endl<<endl<<(double)(clock()-clk)/CLOCKS_PER_SEC<<endl;
#endif
	return 0;
}


Measured memory_bytes: 7296