#include <bits/stdc++.h>
using namespace std;
vector<long long> powers(52, 0);
long long pow2(int m);
long long pow2(int m) {
  if (powers[m] <= 0) {
    if (m == 0) {
      powers[m] = 1;
    } else {
      powers[m] = 2 * pow2(m - 1);
    }
  }
  return powers[m];
}
vector<long long> next(vector<long long> a) {
  vector<long long> res;
  for (int i = 0; i < a.size(); i++) {
    if (i % 2 == 0) {
      res.push_back(a[i] * 2);
    } else
      res.push_back(a[i] * 2 + 1);
  }
  return res;
}
vector<long long> promote(vector<long long> a, int curr, int target) {
  vector<long long> res;
  for (int i = 0; i < a.size(); i++) {
    if (i % 2 == 0) {
      res.push_back(a[i] * pow2(target - curr));
    } else
      res.push_back((a[i] + 1) * pow2(target - curr) - 1);
  }
  return res;
}
vector<long long> merge(vector<vector<long long> > A) {
  priority_queue<pair<long long, long long>,
                 vector<pair<long long, long long> >,
                 greater<pair<long long, long long> > >
      q;
  int m = A.size();
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < A[i].size(); j++) {
      if (j % 2 == 0) {
        q.push(pair<long long, long long>(A[i][j], -i));
      } else {
        q.push(pair<long long, long long>(A[i][j], i));
      }
    }
  }
  vector<long long> res;
  vector<long long> open(m, 0);
  int numOpen = 0;
  while (!q.empty()) {
    pair<long long, long long> x = q.top();
    q.pop();
    long long b = x.first;
    long long ind = abs(x.second);
    if (open[ind] == 1) {
      if (numOpen == m) res.push_back(b);
      open[ind] = 0;
      numOpen--;
    } else if (open[ind] == 0) {
      open[ind] = 1;
      numOpen++;
      if (numOpen == m) res.push_back(b);
    }
  }
  return res;
}
int main() {
  int h, q;
  cin >> h >> q;
  vector<vector<long long> > all;
  if (q == 0) {
    if (h == 1)
      cout << 1 << endl;
    else if (h > 1)
      cout << "Data not sufficient!" << endl;
    return 0;
  }
  for (int i = 0; i < q; i++) {
    long long level, L, R, ans;
    cin >> level >> L >> R >> ans;
    vector<long long> res(0);
    if (ans == 1) {
      L = max(pow2(level - 1), L);
      R = min(pow2(level) - 1, R);
      if (L > R) {
        cout << "Game cheated!" << endl;
        return 0;
      }
      res.push_back(L);
      res.push_back(R);
    } else if (ans == 0) {
      if (L <= pow2(level - 1) && R >= pow2(level) - 1) {
        cout << "Game cheated!" << endl;
        return 0;
      }
      long long L1 = pow2(level - 1);
      long long R1 = pow2(level) - 1;
      if (L1 <= L - 1) {
        res.push_back(L1);
        res.push_back(L - 1);
      }
      if (R1 >= R + 1) {
        res.push_back(R + 1);
        res.push_back(R1);
      }
    }
    res = promote(res, level, h);
    all.push_back(res);
  }
  vector<long long> res = merge(all);
  if (res.empty()) {
    cout << "Game cheated!" << endl;
    return 0;
  }
  if (res.size() > 2) {
    cout << "Data not sufficient!" << endl;
    return 0;
  }
  if (res[1] == res[0]) {
    cout << res[0] << endl;
    return 0;
  }
  cout << "Data not sufficient!" << endl;
  return 0;
}
