import std.stdio, std.conv, std.string;
import std.array, std.range, std.algorithm, std.container;
import std.math, std.random, std.bigint, std.datetime, std.format;
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }

int DEBUG_LEVEL = 0;
void print()(){ writeln(""); }
void print(T, A ...)(T t, lazy A a){ write(t), print(a); }
void print(int level, T, A ...)(T t, lazy A a){ if(level <= DEBUG_LEVEL) print(t, a); }

void main(string[] args){
	if(args.length > 1 && args[1] == "-debug"){
		if(args.length > 2 && args[2].isNumeric) DEBUG_LEVEL = args[2].to!int;
		else DEBUG_LEVEL = 1;
	}
	
	int n = read.to!int;
	int m = read.to!int;
	
	Node[] nodes;
	foreach(i; 0 .. n) nodes ~= new Node(i);
	
	foreach(j; 0 .. m){
		int a = read.to!int - 1;
		int b = read.to!int - 1;
		nodes[a].nodes ~= nodes[b];
		nodes[b].nodes ~= nodes[a];
	}
	
	// 奇数があると駄目
	foreach(nd; nodes){
		if(nd.nodes.length % 2 != 0){
			"No".writeln;
			return;
		}
	}
	
	int d2count, d4count, d6count; // d6は次数6以上
	foreach(nd; nodes){
		if(nd.nodes.length == 2) d2count += 1;
		else if(nd.nodes.length == 4) d4count += 1;
		else d6count += 1;
	}
	
	// 6以上があればOK
	if(d6count > 0){
		"Yes".writeln;
		return;
	}
	
	// 4が1個以下だとだめ
	if(d4count <= 1){
		"No".writeln;
		return;
	}
	
	// 4が3個以上はOK
	if(d4count >= 3){
		"Yes".writeln;
		return;
	}
	
	// 4が2個のときは判別が必要
	// 1つの4から辿っていって自分に戻ってくることがあればOK
	Node nd4;
	foreach(nd; nodes){
		if(nd.nodes.length == 4) nd4 = nd;
	}
	bool f = 0;
	nd4.isVisited = 1;
	foreach(nd; nd4.nodes){
		if(nd.search4() == nd4.id){
			f = 1;
			break;
		}
	}
	if(f == 1) "Yes".writeln;
	else "No".writeln;
	return;
	
}

/*

すべての点の次数が偶数であることは大前提
次数2の点しかないときは無理

次数2の点は省略して考える

次数6の点があるときは必ずOK

次数4の点が1個のときは無理
次数4の点が2個で、自己ループがないときは無理

*/

class Node{
	long _b, _w;
	int id;
	Node[] nodes;
	Node[] kids;
	Node parent;
	bool isVisited;
	this(int id){
		this.id = id;
	}
	int search4(){
		this.isVisited = 1;
		if(this.nodes.length == 4) return this.id;
		if(! this.nodes[0].isVisited) return this.nodes[0].search4();
		else return this.nodes[1].search4();
	}
	
	override string toString(){
		return "id:" ~ id.to!string ~ " b:" ~ _b.to!string ~ " w:" ~ _w.to!string ~ " kids:" ~ kids.map!(x => x.id).to!string;
	}
}
