#include <bits/stdc++.h>
using namespace std;
struct node {
  long long int l, r;
  node(long long int l = 0, long long int r = 0) {
    this->l = l;
    this->r = r;
  }
  bool operator<(const node& other) const {
    return l < other.l || (l == other.l && r > other.r);
  }
};
int h, Q, x, ans, numYes, numNo;
long long int L, R;
long long int pot[60];
node yes[100100];
node no[100100];
vector<node> resp;
vector<node> aux;
node temp;
void intersect(node a) {
  resp[0].l = max(resp[0].l, a.l);
  resp[0].r = min(resp[0].r, a.r);
  if (resp[0].l > resp[0].r) {
    resp.clear();
  }
}
void not_intersect(node a) {
  aux = resp;
  resp.clear();
  for (int i = 0; i < aux.size(); i++) {
    temp = node(max(aux[i].l, a.l), min(aux[i].r, a.r));
    if (temp.l > temp.r) {
      resp.push_back(aux[i]);
    } else {
      if (temp.l != aux[i].l) {
        resp.push_back(node(aux[i].l, temp.l - 1LL));
      }
      if (temp.r != aux[i].r) {
        resp.push_back(node(temp.r + 1LL, aux[i].r));
      }
    }
  }
}
int main() {
  pot[0] = 1;
  for (int i = 1; i < 60; i++) {
    pot[i] = 2LL * pot[i - 1];
  }
  scanf(" %d %d", &h, &Q);
  resp.clear();
  resp.push_back(node(pot[h - 1], pot[h] - 1LL));
  numYes = 0;
  numNo = 0;
  for (int i = 0; i < Q; i++) {
    scanf(" %d %I64d %I64d %d", &x, &L, &R, &ans);
    if (ans == 1) {
      yes[numYes] = node(L * pot[h - x], (R + 1LL) * pot[h - x] - 1LL);
      numYes++;
    } else {
      no[numNo] = node(L * pot[h - x], (R + 1LL) * pot[h - x] - 1LL);
      numNo++;
    }
  }
  for (int i = 0; i < numYes && resp.size() > 0; i++) {
    intersect(yes[i]);
  }
  sort(no, no + numNo);
  for (int i = 0; i < numNo && resp.size() > 0 && resp.size() < 3; i++) {
    not_intersect(no[i]);
  }
  if (resp.size() == 0) {
    printf("Game cheated!\n");
  } else if (resp.size() == 1 && resp[0].l == resp[0].r) {
    printf("%I64d\n", resp[0].r);
  } else {
    printf("Data not sufficient!\n");
  }
  return 0;
}
