#include <bits/stdc++.h>
using namespace std;
int Add(int &a, int b) { a = (a + b) % 1000000007; }
int Min(int &a, int b) { a = (a + 1000000007 - b) % 1000000007; }
int Mul(int &a, int b) { a = (long long)a * b % 1000000007; }
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long pow(long long a, long long b) {
  long long res(1);
  while (b) {
    if (b & 1) res = res * a % 1000000007;
    a = a * a % 1000000007;
    b >>= 1;
  }
  return res;
}
long long powM(long long a, long long b, long long mod) {
  long long res(1);
  while (b) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return res;
}
const int infi = 2147483647;
const long long infl = 9223372036854775807;
int n, m, k, T;
int r[100010], l[100010], f[101][100010][2];
void upd(int &x, int y) { x = min(x, y); }
deque<pair<int, int> > q[4];
int tmp;
void ins(int i, int x, int idx) {
  while (!q[i].empty()) {
    if (q[i].back().first > x)
      q[i].pop_back();
    else
      break;
  }
  q[i].push_back(make_pair(x, idx));
}
int getmi(int i, int d) {
  if (q[i].empty()) return 1e9;
  while (q[i].front().second < d) q[i].pop_front();
  return q[i].front().first;
}
int main() {
  scanf("%d", &n), scanf("%d", &k);
  memset(f, 127, sizeof f);
  f[0][0][0] = 0;
  for (int i = 1; i <= (k); ++i) {
    scanf("%d", &l[i]), scanf("%d", &r[i]);
  }
  if (l[1] == 0) {
    f[0][0][1] = 0;
    if (r[1])
      l[1]++;
    else {
      for (int i = 1; i <= (k - 1); ++i) l[i] = l[i + 1], r[i] = r[i + 1];
      k--;
    }
  }
  for (int i = 1; i <= (k); ++i) {
    int gap = max(0, l[i] - r[i - 1] - 1);
    int len = r[i] - l[i] + 1;
    f[i][0][1] = f[i - 1][0][1];
    ins(0, f[i - 1][0][0], 0);
    for (int t = 1; t <= (r[i]); ++t) {
      upd(f[i][t][1], f[i - 1][t][1]);
      if (t >= len + gap) upd(f[i][t][0], f[i - 1][t - len - gap][0]);
      ins(0, f[i - 1][t][1], t);
      if (0 <= min(t, len - 1))
        upd(f[i][t][0], getmi(0, max(0, t - len + 1)) + 1);
      if (t >= 1 + gap) {
        ins(1, f[i - 1][t - 1 - gap][0], t - 1 - gap);
        if (1 <= min(t - gap, len - 1))
          upd(f[i][t][0], getmi(1, max(0, t - len + 1 - gap)) + 2);
        ins(2, f[i - 1][t - 1 - gap][0], t - 1 - gap);
        if (1 <= min(t - gap, len))
          upd(f[i][t][1], getmi(2, max(0, t - len - gap)) + 1);
      }
      if (t > 0) {
        ins(3, f[i - 1][t - 1][1], t - 1);
        if (1 <= min(len - 1, t))
          upd(f[i][t][1], getmi(3, max(0, t - len + 1)) + 2);
      }
    }
    for (int i = 0; i < (4); ++i) q[i].clear();
  }
  int gap = 2 * n - r[k];
  int ans = min(f[k][n - gap][0], f[k][n][1]);
  if (ans > 1e9 || gap > n)
    puts("Hungry");
  else {
    puts("Full"), printf("%d", (ans)), putchar('\n');
  }
  return 0;
}
