#include <bits/stdc++.h>
using namespace std;
struct data {
  long long l, r;
  data() {}
  data(long long l, long long r) : l(l), r(r) {}
} qu[100100];
long long ha[600600];
int ll[2402400], rr[2402400], zuo[2402400], you[2402400];
bool lz[2402400];
void build(int l, int r, int i) {
  ll[i] = l;
  rr[i] = r;
  lz[i] = false;
  if (l == r) {
    zuo[i] = l;
    you[i] = r;
    return;
  }
  int m = l + r >> 1, ls = i << 1, rs = ls | 1;
  build(l, m, ls);
  build(m + 1, r, rs);
  zuo[i] = min(zuo[ls], zuo[rs]);
  you[i] = max(you[ls], you[rs]);
}
void down(int i) {
  int ls = i << 1, rs = ls | 1;
  lz[ls] = lz[rs] = true;
  zuo[ls] = zuo[rs] = 0x3f3f3f3f;
  you[ls] = you[rs] = -1;
  lz[i] = false;
}
void update(int l, int r, int i) {
  if (ll[i] == l && rr[i] == r) {
    lz[i] = true;
    zuo[i] = 0x3f3f3f3f;
    you[i] = -1;
    return;
  }
  if (lz[i]) down(i);
  int m = ll[i] + rr[i] >> 1, ls = i << 1, rs = ls | 1;
  if (r <= m)
    update(l, r, ls);
  else if (l > m)
    update(l, r, rs);
  else
    update(l, m, ls), update(m + 1, r, rs);
  zuo[i] = min(zuo[ls], zuo[rs]);
  you[i] = max(you[ls], you[rs]);
}
int ql(int l, int r, int i) {
  if (ll[i] == l && rr[i] == r) return zuo[i];
  if (lz[i]) down(i);
  int m = ll[i] + rr[i] >> 1, ls = i << 1, rs = ls | 1;
  if (r <= m)
    return ql(l, r, ls);
  else if (l > m)
    return ql(l, r, rs);
  else
    return min(ql(l, m, ls), ql(m + 1, r, rs));
}
int qr(int l, int r, int i) {
  if (ll[i] == l && rr[i] == r) return you[i];
  if (lz[i]) down(i);
  int m = ll[i] + rr[i] >> 1, ls = i << 1, rs = ls | 1;
  if (r <= m)
    return qr(l, r, ls);
  else if (l > m)
    return qr(l, r, rs);
  else
    return max(qr(l, m, ls), qr(m + 1, r, rs));
}
int main() {
  int h, q;
  scanf("%d%d", &h, &q);
  int d, ans, tot = 0, cnt = 0;
  long long l, r, mi = 1LL << h - 1, ma = (1LL << h) - 1;
  ha[tot++] = mi - 1, ha[tot++] = mi, ha[tot++] = mi + 1;
  ha[tot++] = ma - 1;
  ha[tot++] = ma;
  ha[tot++] = ma + 1;
  while (q--) {
    scanf("%d%I64d%I64d%d", &d, &l, &r, &ans);
    l <<= (h - d);
    r = (r + 1 << h - d) - 1;
    if (ans) {
      mi = max(mi, l);
      ma = min(ma, r);
    } else {
      qu[cnt++] = data(l, r);
      ha[tot++] = l - 1;
      ha[tot++] = l;
      ha[tot++] = l + 1;
      ha[tot++] = r - 1;
      ha[tot++] = r;
      ha[tot++] = r + 1;
    }
  }
  if (ma < mi) {
    puts("Game cheated!");
    return 0;
  }
  ha[tot++] = mi - 1;
  ha[tot++] = mi;
  ha[tot++] = mi;
  ha[tot++] = ma - 1;
  ha[tot++] = ma;
  ha[tot++] = ma + 1;
  sort(ha, ha + tot);
  tot = unique(ha, ha + tot) - ha;
  build(1, tot, 1);
  while (cnt--)
    update(upper_bound(ha, ha + tot, qu[cnt].l) - ha,
           upper_bound(ha, ha + tot, qu[cnt].r) - ha, 1);
  int ansl = ql(upper_bound(ha, ha + tot, mi) - ha, tot, 1);
  int ansr = qr(1, upper_bound(ha, ha + tot, ma) - ha, 1);
  if (ansl == ansr)
    printf("%I64d\n", ha[ansl - 1]);
  else if (ansr > ansl)
    puts("Data not sufficient!");
  else
    puts("Game cheated!");
  return 0;
}
