#include<cstdio>
#define RI register int
#define CI const int&
using namespace std;
const int N=100005;
struct edge
{
	int to,nxt;
}e[N<<1]; int n,m,head[N],cnt,x,y,deg[N],c4,num; bool vis[N];
inline void addedge(CI x,CI y)
{
	e[++cnt]=(edge){y,head[x]}; head[x]=cnt;
	e[++cnt]=(edge){x,head[y]}; head[y]=cnt;
}
#define to e[i].to
inline void DFS(CI now)
{
	if (now==y) return (void)(++num);
	for (RI i=head[now];i;i=e[i].nxt)
	if (!vis[i+1>>1]) vis[i+1>>1]=1,DFS(to);
}
#undef to
int main()
{
	RI i; for (scanf("%d%d",&n,&m),i=1;i<=m;++i)
	scanf("%d%d",&x,&y),addedge(x,y),++deg[x],++deg[y];
	for (i=1;i<=n;++i) if (deg[i]&1) return puts("No"),0;
	for (i=1;i<=n;++i) if (deg[i]>=6) return puts("Yes"),0;
	for (i=1;i<=n;++i) if (deg[i]==4) ++c4;
	if (c4>=3) return puts("Yes"),0; if (c4<=1) return puts("No"),0;
	for (i=1;i<=n;++i) if (deg[i]==4) { x=i; break; }
	for (i=x+1;i<=n;++i) if (deg[i]==4) { y=i; break; }
	return DFS(x),puts(num==4?"No":"Yes"),0;
}