#include <bits/stdc++.h>
using namespace std;
const long long max_h = 55;
long long h, q, size, asize;
vector<pair<pair<long long, long long>, long long>> vec, sec;
set<pair<long long, long long>> st;
vector<pair<long long, long long>> ans;
long long save[max_h];
void init() {
  save[1] = 1;
  for (long long i = 2; i < max_h; i++) save[i] = (save[i - 1] << 1) ^ 1;
}
void add(long long l, long long r) {
  set<pair<long long, long long>>::iterator it = st.lower_bound({l, r});
  while (it != st.begin()) {
    it--;
    if ((*it).first < l) break;
  }
  vector<pair<long long, long long>> gec;
  while (it != st.end()) {
    pair<long long, long long> t = *it;
    it++;
    if (t.second < l) continue;
    if (t.first > r) break;
    if (t.first < l) l = t.first;
    if (t.second > r) r = t.second;
    gec.push_back(t);
  }
  for (long long i = 0; i < gec.size(); i++) st.erase(gec[i]);
  st.insert({l, r});
}
bool no_exit() {
  set<pair<long long, long long>>::iterator it = st.begin();
  long long sum = 0;
  while (it != st.end()) {
    sum += (*it).second - (*it).first + 1;
    it++;
  }
  return sum == size;
}
void get(long long l, long long r) {
  set<pair<long long, long long>>::iterator it = st.begin();
  while (it != st.end() && l <= r) {
    pair<long long, long long> t = *it;
    it++;
    if (t.second < l) continue;
    if (t.first > r) {
      ans.push_back({l, r});
      return;
    }
    if (t.first <= l) {
      l = t.second + 1;
      continue;
    }
    if (t.first > l) {
      ans.push_back({l, t.first - 1});
      l = t.second + 1;
    }
  }
  if (l <= r) ans.push_back({l, r});
}
int main() {
  scanf("%I64d%I64d", &h, &q);
  init();
  size = 1;
  size <<= (h - 1);
  while (q--) {
    long long l, r, c, t;
    scanf("%I64d%I64d%I64d%I64d", &c, &l, &r, &t);
    if (t == 0)
      vec.push_back({{l, r}, c});
    else
      sec.push_back({{l, r}, c});
  }
  for (long long i = 0; i < vec.size(); i++) {
    long long l = (vec[i].first.first << (h - vec[i].second));
    long long r =
        (vec[i].first.second << (h - vec[i].second)) | save[h - vec[i].second];
    add(l, r);
  }
  if (no_exit()) {
    printf("Game cheated!\n");
    return 0;
  }
  sec.push_back({{1, 1}, 1});
  long long mini = -1, maxi = -1;
  for (long long i = 0; i < sec.size(); i++) {
    long long l = (sec[i].first.first << (h - sec[i].second));
    long long r =
        (sec[i].first.second << (h - sec[i].second)) | save[h - sec[i].second];
    if (mini == -1 || mini > r) mini = r;
    if (maxi == -1 || maxi < l) maxi = l;
  }
  if (maxi > mini) {
    printf("Game cheated!\n");
    return 0;
  }
  get(maxi, mini);
  if (ans.size() == 0) {
    printf("Game cheated!\n");
    return 0;
  }
  if ((*ans.begin()).first != (*ans.begin()).second || ans.size() > 1) {
    printf("Data not sufficient!\n");
    return 0;
  }
  printf("%I64d\n", (*ans.begin()).first);
  return 0;
}
