#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct bian
{
	int nxt,to;
}bi[200020];
int n,m,head[100010],num,d[100010],st[100010],tp,l[100010],r[100010];
bool used[100010],ok[100010];
inline void add(int from,int to){bi[++num]=bian{head[from],to};head[from]=num;++d[to];}
void dfs(int v)
{
	for(int &i=head[v],u;i;i=bi[i].nxt)
		if(!used[(i+1)/2])
		{
			u=bi[i].to;used[(i+1)/2]=1;
			dfs(u);
		}
	st[++tp]=v;
}
int main()
{
	scanf("%d %d",&n,&m);
	int x,y;
	for(int i=1;i<=m;++i)
	{
		scanf("%d %d",&x,&y);
		add(x,y),add(y,x);
	}
	for(int i=1;i<=n;++i)if(d[i]&1)return printf("No"),0;
	for(int i=1;i<=n;++i)if(d[i]>=6)return printf("Yes"),0;
	int cnt=0;
	for(int i=1;i<=n;++i)cnt+=d[i]==4;
	if(cnt>=3)return printf("Yes"),0;
	dfs(1);
//	for(int i=1;i<=tp;++i)printf("%d ",st[i]);printf("\n");
	int minr=0x3f3f3f3f;
	for(int i=tp-1;i;--i)
	{
		ok[i]=ok[i+1];
		if(!l[st[i]])l[st[i]]=r[st[i]]=i;
		else
		{
			if(r[st[i]]>minr)return printf("Yes"),0;
			if(ok[l[st[i]]])return printf("Yes"),0;
			minr=min(minr,l[st[i]]);
			l[st[i]]=i;
			ok[i]=1;
		}		
	}
	printf("No");
	return 0;
}
