Problem:
Score : 800 points

Problem Statement

You are given a simple connected undirected graph consisting of N vertices and M edges.
The vertices are numbered 1 to N, and the edges are numbered 1 to M.

Edge i connects Vertex a_i and b_i bidirectionally.

Determine if three circuits (see Notes) can be formed using each of the edges exactly once.

Notes

A circuit is a cycle allowing repetitions of vertices but not edges.

Constraints

All values in input are integers.

1 \leq N,M \leq 10^{5}

1 \leq a_i, b_i \leq N

The given graph is simple and connected.

Input

Input is given from Standard Input in the following format:

N M
a_1 b_1
:
a_M b_M

Output

If three circuits can be formed using each of the edges exactly once, print Yes; if they cannot, print No.

Sample Input 1

7 9
1 2
1 3
2 3
1 4
1 5
4 5
1 6
1 7
6 7

Sample Output 1

Yes

Three circuits can be formed using each of the edges exactly once, as follows:

Sample Input 2

3 3
1 2
2 3
3 1

Sample Output 2

No

Three circuits are needed.

Sample Input 3

18 27
17 7
12 15
18 17
13 18
13 6
5 7
7 1
14 5
15 11
7 6
1 9
5 4
18 16
4 6
7 2
7 11
6 3
12 14
5 2
10 5
7 8
10 15
3 15
9 8
7 15
5 16
18 15

Sample Output 3

Yes

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define pb push_back
#define gc getchar 
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef double db;

int n,m,rt,cn,ans,num,d[N];
int head[N],to[N],nxt[N],tot=1,usd[N];
bool inq[N];int bel[N],f[N];

char cp;
template<class T>inline void rd(T &x)
{
	cp=gc();x=0;int f=0;
	for(;!isdigit(cp);cp=gc()) if(cp=='-') f=1;
	for(;isdigit(cp);cp=gc()) x=x*10+(cp^48);
	if(f) x=-x;
}

inline void lk(int u,int v)
{to[++tot]=v;nxt[tot]=head[u];head[u]=tot;}

inline int getfa(int x){return (x==f[x])?x:(f[x]=getfa(f[x]));}

void dfs(int x)
{
	int j;
	if(inq[x]) ans++;else inq[x]=true;if(x==rt) cn++;
	if(bel[x] && (bel[x]^num)) f[getfa(num)]=getfa(bel[x]);
	bel[x]=num;if(cn==2) {inq[x]=false;return;}
	for(int &i=head[x];i;i=nxt[i]) if((!usd[i])){
		j=to[i];usd[i]=usd[i^1]=1;dfs(j);
	//	if(cn==2) {inq[x]=false;return;}
		break;
	}
	inq[x]=false;
}

int main(){
	int i,k,x,y,lim;
    rd(n);rd(m);
    for(i=1;i<=m;++i){
    	rd(x);rd(y);//lk(x,y);lk(y,x);
    	d[x]++;d[y]++;
	}
	for(i=1;i<=n;++i){
		if(d[i]<2 || (d[i]&1)) {puts("No");return 0;}
		ans+=(d[i]-2)/2;
	}
//	for(i=1;i<=n;){
//		for(int &j=head[i];j;j=nxt[j]) if(!usd[j]) break;
//		if(head[i]){
//		   rt=i;cn=0;num++;f[num]=num;
//		   dfs(rt);if(cn<2) {puts("No");return 0;}
//		}else i++;
//	}
//	y=0;
//	for(i=1;i<=num;++i) if(getfa(i)==i) ++y;
//	puts((ans>=3 && y<=3)?"Yes":"No");
    puts(ans>=2?"Yes":"No");
	return 0;
}