#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
#define PB push_back
#define MP make_pair
#define LL long long
#define int LL
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define RE(i,n) FOR(i,1,n)
#define REP(i,n) FOR(i,0,(int)(n)-1)
#define R(i,n) REP(i,n)
#define VI vector<int>
#define PII pair<int,int>
#define LD long double
#define FI first
#define SE second
#define st FI
#define nd SE
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())

#define unordered_map __fast_unordered_map
template<class Key, class Value, class Hash = std::hash<Key>>
using unordered_map = __gnu_pbds::gp_hash_table<Key, Value, Hash>;

template<class C> void mini(C &a4, C b4) { a4 = min(a4, b4); }
template<class C> void maxi(C &a4, C b4) { a4 = max(a4, b4); }

template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<'='<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  while(*sdbg!=',')cerr<<*sdbg++;
  cerr<<'='<<h<<','; _dbg(sdbg+1, a...);
}

template<class T> ostream &operator<<(ostream& os, vector<T> V) {
  os << "["; for (auto vv : V) os << vv << ","; return os << "]";
}
template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) {
  return os << "(" << P.st << "," << P.nd << ")";
}

#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif

// from our acm library
struct Euler {
  struct Edge { int nei, nr; };
  vector<vector<Edge>> slo;
  VI ans, used, deg, beg;
  int e_num, n;
  Euler() : e_num(0), n(0) {}
  void AddEdge(int a, int b) {
    e_num++;
    if (a > n || b > n) {
      n = max(a, b);
      slo.resize(n + 2);
      deg.resize(n + 2);
      beg.resize(n + 2);
    }
    used.PB(0);
    slo[a].PB({b, e_num});
    slo[b].PB({a, e_num});
    deg[a]++; deg[b]++;
  }
  VI FindEuler() { // if used many times, please clear ans, beg, used
    used.PB(0);
    assert(SZ(used) > e_num);
    RE (i, n) { if (deg[i] % 2 == 1) { return VI(); } }
    Go(1);
    return ans;
  }
private:
  void Go(int v) {
    debug(v);
    while (beg[v] < SZ(slo[v])) {
      Edge& e = slo[v][beg[v]];
      beg[v]++;
      int nei = e.nei;
      if (used[e.nr]) { continue; }
      used[e.nr] = 1;
      Go(nei);
      ans.PB(nei);
    }
  }
};

int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(11);
  cerr << fixed << setprecision(6);

  int N, M;
  cin >> N >> M;
  vector<VI> adj(N + 1);
  Euler euler;
  for (int i = 0; i < M; ++i) {
    int a, b;
    cin >> a >> b;
    adj[a].PB(b); adj[b].PB(a);
    euler.AddEdge(a, b);
  }

  auto circ = euler.FindEuler();
  if (circ.empty()) {
    cout << "No\n";
    return 0;
  }
  debug(circ);

  bool any6 = false;
  VI list4;
  for (int i = 1; i <= N; ++i) {
    if (SZ(adj[i]) >= 6) {
      any6 = true;
    } else if (SZ(adj[i]) == 4) {
      list4.PB(i);
    }
  }

  if (any6 || SZ(list4) >= 3) {
    cout << "Yes\n";
    return 0;
  }

  if (SZ(list4) <= 1) {
    cout << "No\n";
    return 0;
  }

  int a = list4[0];
  int b = list4[1];

  int last_who = -1;
  for (int i = 0; i < SZ(circ); ++i) {
    int now_who = circ[i] == a ? 1 : circ[i] == b ? 2 : -1;
    if (now_who != -1) {
      if (now_who == last_who) {
        cout << "Yes\n";
        return 0;
      }
      last_who = now_who;
    }
  }

  cout << "No\n";

}



Measured memory_bytes: 22048