#include <bits/stdc++.h>
template <class T>
int size(const T &x) {
  return x.size();
}
using namespace std;
long long int readint() {
  char cc = getchar();
  while (cc < '0' || cc > '9') {
    cc = getchar();
  }
  long long int ans = 0;
  while (cc >= '0' && cc <= '9') {
    ans = ans * 10 + cc - '0';
    cc = getchar();
  }
  return ans;
};
long long int fast_exp(int base, int exp) {
  long long int res = 1;
  while (exp > 0) {
    if (exp % 2 == 1) res = (res * base) % 1000000007;
    base = (base * base) % 1000000007;
    exp /= 2;
  }
  return res % 1000000007;
}
struct ran {
  long long int l;
  long long int r;
  int h;
};
vector<ran> add, sub;
bool comp(ran a, ran b) { return a.l < b.l; }
long long int tpow[62];
int main() {
  int h, k;
  scanf("%d %d", &h, &k);
  tpow[0] = 1;
  for (int i = 1; i < 60; i++) tpow[i] = tpow[i - 1] << 1;
  long long int L, R, T;
  int H;
  add.push_back({tpow[h - 1], 2 * tpow[h - 1] - 1, 1});
  for (int i = 0; i < k; i++) {
    cin >> H;
    L = readint(), R = readint(), T = readint();
    L = L * tpow[h - H];
    R = R * tpow[h - H] + tpow[h - H] - 1;
    if (T == 1)
      add.push_back({L, R, H});
    else
      sub.push_back({L, R, H});
  }
  sort(add.begin(), add.end(), comp);
  sort(sub.begin(), sub.end(), comp);
  long long int l, r;
  l = add[0].l;
  r = add[0].r;
  for (int i = 1; i < add.size(); i++) {
    long long int tl, tr;
    tl = add[i].l;
    tr = add[i].r;
    l = max(l, tl);
    r = min(r, tr);
    if (l > r) {
      printf("Game cheated!");
      return 0;
    }
  }
  vector<ran> add;
  add.push_back({l, r, h});
  vector<ran> merge;
  ran m = {0, 0, 0};
  if (sub.size() > 0) m = sub[0];
  for (int i = 1; i < sub.size(); i++) {
    long long int lc, lp, rc, rp;
    lc = sub[i].l;
    if (m.l <= lc && lc - m.r <= 1)
      m.r = max(m.r, sub[i].r);
    else
      merge.push_back(m), m = sub[i];
  }
  merge.push_back(m);
  long long int ans = 0;
  vector<ran> a;
  for (int i = 0; i < merge.size(); i++) {
    long long int lc = merge[i].l, rc = merge[i].r;
    if (rc < add[0].l || lc > add[0].r) continue;
    if (lc <= add[0].l && rc >= add[0].r) {
      printf("Game cheated!");
      return 0;
    } else if (lc == add[0].l + 1 && rc >= add[0].r) {
      cout << add[0].l;
      return 0;
    } else if (rc == add[0].r - 1 && lc <= add[0].l) {
      cout << add[0].r;
      return 0;
    } else if (i + 1 < merge.size() && lc <= add[0].l &&
               merge[i + 1].r >= add[0].r && rc == merge[i + 1].l - 2) {
      cout << rc + 1;
      return 0;
    } else {
      cout << "Data not sufficient!";
      return 0;
    }
  }
  if (add[0].l == add[0].r) cout << add[0].l;
  if (add[0].l < add[0].r) cout << "Data not sufficient!";
  return 0;
};
