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: Accepted)

#include <bits/stdc++.h>

#define rep(i,n) for(int i=0; i<(n); i++)
#define reps(i,x,n) for(int i=x; i<(n); i++)
#define rrep(i,n) for(int i=(n)-1; i>=0; i--)
#define all(X) (X).begin(),(X).end()
#define X first
#define Y second
#define pb push_back
#define eb emplace_back

using namespace std;
typedef long long int ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }

template<class A, size_t N, class T> void Fill(A (&a)[N], const T &v){ fill( (T*)a, (T*)(a+N), v ); }

template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"; return os;}
template<class T,size_t n> ostream& operator<<(ostream &os, const array<T,n> &t) {os<<"{"; rep(i,n) {os<<t[i]<<",";} os<<"}"; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}

const ll INF = 1e9+7;

int N, M, ans=0;
vector<pii> edge[100005];
bool visited[100005];
bool used[100005];
int dfs(int n, int b, int S, int T){
	if(n == T) return 1;
	if(n == S && b != -1) return 0;
	int ret = 0;
	for(auto p: edge[n]) if(p.X != b){
		ret += dfs(p.X, n, S, T);
	}
	return ret;
}

int main(){
	ios_base::sync_with_stdio(false);

	cin >> N >> M;
	rep(i,M){
		int a, b;
		cin >> a >> b;
		a--; b--;
		edge[a].emplace_back(b, i);
		edge[b].emplace_back(a, i);
	}

	bool f = true;
	rep(i,N) if(edge[i].size() % 2 != 0){
		cout << "No" << endl;
		return 0;
	}

	rep(i,N) if(edge[i].size() >= 6){
		cout << "Yes" << endl;
		return 0;
	}

	vector<int> four;
	rep(i,N) if(edge[i].size() == 4) four.push_back(i);

	if(four.size() < 2){
		f = false;
	}else if(four.size() == 2){
		int ret = dfs(four[0], -1, four[0], four[1]);
		if(ret == 4) f = false;
	}

	cout << (f ? "Yes" : "No") << endl;

	return 0;
}