#include <bits/stdc++.h>
using namespace std;
int h, query;
void input() { scanf("%d %d", &h, &query); }
long long getleftindex(int layer, long long v) {
  while (layer < h) {
    layer++;
    v = (v << 1);
  }
  return v;
}
long long getrightindex(int layer, long long v) {
  while (layer < h) {
    layer++;
    v = (v << 1) + 1;
  }
  return v;
}
map<long long, long long> pool[2];
int q, p;
bool check(long long key, long long value, long long l, long long r) {
  map<long long, long long>::iterator it = pool[q].find(key);
  if (key > r || value < l) return false;
  pool[q].erase(key);
  if (key >= l && value <= r) {
    ;
  } else if (key < l) {
    pool[q][key] = l - 1;
    if (value > r) {
      pool[q][r + 1] = value;
    }
  } else if (key >= l) {
    pool[q][r + 1] = value;
  }
  return true;
}
void process() {
  int i, j, k, layer;
  long long l, r;
  l = getleftindex(1, 1);
  r = getrightindex(1, 1);
  map<long long, long long>::iterator it;
  pool[1][l] = r;
  bool isvalid = true;
  q = 1;
  p = 0;
  for (i = 1; i <= query && isvalid; i++) {
    scanf("%d %I64d %I64d %d", &layer, &l, &r, &k);
    l = getleftindex(layer, l);
    r = getrightindex(layer, r);
    if (k == 1) {
      it = pool[q].lower_bound(l);
      if (it == pool[q].end()) {
        it--;
        if (l > it->second) {
          isvalid = false;
          break;
        } else {
          long long key = l;
          long long value = min(it->second, r);
          pool[q].clear();
          pool[q][key] = value;
        }
      } else {
        if (it != pool[q].begin()) {
          it--;
          if (it->second < l) it++;
        }
        pool[p].clear();
        while (it != pool[q].end() && it->first <= r) {
          pool[p][max(it->first, l)] = min(it->second, r);
          it++;
        }
        p = p ^ 1;
        q = q ^ 1;
      }
    } else {
      bool flag1, flag2;
      while (!pool[q].empty()) {
        flag1 = flag2 = false;
        it = pool[q].lower_bound(l);
        if (it == pool[q].end()) it--;
        long long key = it->first;
        long long value = it->second;
        if (it != pool[q].begin()) {
          it--;
          flag1 = check(it->first, it->second, l, r);
        }
        flag2 = check(key, value, l, r);
        if (!flag1 && !flag2) break;
      }
    }
    if (pool[q].empty()) {
      isvalid = false;
      break;
    }
  }
  if (!isvalid) {
    printf("Game cheated!\n");
  } else {
    long long ret = 0;
    for (it = pool[q].begin(); it != pool[q].end() && ret <= 1; it++) {
      ret += (it->second - it->first + 1);
    }
    if (ret == 1) {
      printf("%I64d\n", pool[q].begin()->first);
    } else {
      printf("Data not sufficient!\n");
    }
  }
}
int main() {
  input();
  process();
  return 0;
}
