#include <bits/stdc++.h>
using std::cin;
using std::cout;
template <class _Tp>
inline _Tp abs(const _Tp &x) {
  return x < 0 ? -x : x;
}
template <class _Tp>
inline _Tp max(const _Tp &a, const _Tp &b) {
  return a > b ? a : b;
}
template <class _Tp>
inline _Tp min(const _Tp &a, const _Tp &b) {
  return a < b ? a : b;
}
template <class _Tp>
inline void inc(_Tp &a, const _Tp &b) {
  if (a < b) a = b;
}
template <class _Tp>
inline void dec(_Tp &a, const _Tp &b) {
  if (a > b) a = b;
}
template <class _Tp>
inline void swap(_Tp &a, _Tp &b) {
  _Tp c = a;
  a = b;
  b = c;
}
template <class _Tp>
inline bool operator==(const _Tp &A, const _Tp &B) {
  return !memcmp(&A, &B, sizeof(_Tp));
}
long long f[2][200005], A[105][2], Q[200005], n, K;
void updata(int now) {
  int i, l, r, T = now & 1, F = T ^ 1;
  memcpy(f[T], f[F], 200005 << 3);
  for (r = (l = 0) - 1, i = n * 2; ~i; --i) {
    while (l <= r && Q[l] - i > A[now][1] - A[now][0]) ++l;
    if (l <= r) dec(f[T][i], f[F][Q[l]] + 2);
    if (f[F][i] >= 0x3f3f3f3f3f3f3f3fLL) continue;
    while (l <= r && f[F][i] < f[F][Q[r]]) --r;
    Q[++r] = i;
  }
  for (r = (l = 0) - 1, i = n * 2 - A[now][1]; i <= n * 2; ++i) {
    if (f[F][n * 2 - i + n * 2 - A[now][1]] < 0x3f3f3f3f3f3f3f3fLL) {
      while (l <= r && f[F][n * 2 - i + n * 2 - A[now][1]] < f[F][Q[r]]) --r;
      Q[++r] = n * 2 - i + n * 2 - A[now][1];
    }
    while (l <= r && i - n * 2 + Q[l] > n * 2 - A[now][0]) ++l;
    if (l <= r) dec(f[T][i], f[F][Q[l]] + 1);
  }
}
int main() {
  scanf("%lld%lld", &n, &K);
  for (int i = (0); i < (K); ++i) scanf("%lld%lld", A[i], A[i] + 1);
  memset(f, 0x3f, sizeof(f));
  f[1][n * 2] = 0;
  for (int i = (0); i < (K); ++i) updata(i);
  K = ~K & 1;
  printf(f[K][n] < 0x3f3f3f3f3f3f3f3fLL ? "Full\n%d\n" : "Hungry\n", f[K][n]);
  return 0;
}
