#include <bits/stdc++.h>
using namespace std;
template <typename T>
bool checkmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool checkmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int maxn = 1e5 + 100;
struct Event {
  long long L, R;
} e[maxn * 10];
long long a[maxn * 10];
int num = 0, num1 = 0;
int T[maxn * 10];
void Pushdown(int rt, int l, int r) {
  if (l == r) return;
  T[(rt << 1)] += T[rt];
  T[(rt << 1 | 1)] += T[rt];
  T[rt] = 0;
}
void add(int rt, int l, int r, int L, int R) {
  Pushdown(rt, l, r);
  if (l == L && r == R) {
    T[rt]++;
    return;
  }
  if (R <= ((l + r) >> 1))
    add((rt << 1), l, ((l + r) >> 1), L, R);
  else if (L > ((l + r) >> 1))
    add((rt << 1 | 1), ((l + r) >> 1) + 1, r, L, R);
  else
    add((rt << 1), l, ((l + r) >> 1), L, ((l + r) >> 1)),
        add((rt << 1 | 1), ((l + r) >> 1) + 1, r, ((l + r) >> 1) + 1, R);
}
int qu(int rt, int l, int r, int x) {
  Pushdown(rt, l, r);
  if (l == x && l == r) {
    return T[rt];
  }
  if (x <= ((l + r) >> 1))
    return qu((rt << 1), l, ((l + r) >> 1), x);
  else
    return qu((rt << 1 | 1), ((l + r) >> 1) + 1, r, x);
}
int main() {
  int h, q;
  scanf("%d %d", &h, &q);
  a[num++] = 1LL << (h - 1);
  a[num++] = 1LL << h;
  int Q = q;
  while (q--) {
    int i, th, ans;
    long long L, R;
    cin >> i >> L >> R >> ans;
    th = i;
    while (th < h) L <<= 1, R = R * 2 + 1, th++;
    if (ans) {
      e[num1++] = (Event){L, R + 1};
      a[num++] = L;
      a[num++] = R + 1;
    } else {
      if (L > (1LL << (h - 1))) {
        a[num++] = (1LL << (h - 1));
        a[num++] = L;
        e[num1++] = (Event){a[num - 2], a[num - 1]};
      }
      if (R + 1 < (1LL << h)) {
        a[num++] = R + 1;
        a[num++] = (1LL << h);
        e[num1++] = (Event){a[num - 2], a[num - 1]};
      }
    }
  }
  sort(a, a + num);
  int nnum = num, pos = 0;
  for (int i = 0; i < nnum; i++)
    if (a[i] == (1LL << h)) {
      pos = i;
      break;
    }
  num = unique(a, a + num) - a;
  for (int i = 0; i < num1; i++) {
    int L = lower_bound(a, a + num, e[i].L) - a;
    int R = lower_bound(a, a + num, e[i].R) - a;
    if (R >= num) {
      printf("post = %d,num = %d,a[num-1] = %I64d\n", pos, num, a[num - 1]);
      break;
    }
    add(1, 1, num, L + 1, R);
  }
  long long cnt = 0;
  long long ans = 0;
  for (int i = 1; i < num; i++) {
    if (qu(1, 1, num, i) == Q) {
      cnt += a[i] - a[i - 1], ans = a[i - 1];
    }
  }
  if (cnt == 1)
    cout << ans << endl;
  else if (cnt == 0)
    printf("Game cheated!\n");
  else
    printf("Data not sufficient!\n");
  return 0;
}
