#include <bits/stdc++.h>
using namespace std;
const int MAXK = 110;
const int MAXN = 100010;
const int INF = 0x3f3f3f3f;
int n, k;
int dp[MAXK][MAXN << 1];
int leftt[MAXK];
int rightt[MAXK];
int query(int tree, int pos) {
  int ret = INF;
  pos += n + 1;
  while (pos) {
    ret = min(ret, dp[tree][pos]);
    pos >>= 1;
  }
  return ret;
}
void update(int tree, int left, int right, int val) {
  if (left > n || right < 0) return;
  right = min(right, n);
  left = max(left, 0);
  left += n + 1;
  right += n + 2;
  while (left < right) {
    if (left & 1) {
      dp[tree][left] = min(dp[tree][left], val);
      ++left;
    }
    if (right & 1) {
      --right;
      dp[tree][right] = min(dp[tree][right], val);
    }
    left >>= 1;
    right >>= 1;
  }
}
int main() {
  cin >> n >> k;
  for (int i = 1; i <= k; ++i) cin >> leftt[i] >> rightt[i];
  k++;
  leftt[k] = rightt[k] = 2 * n;
  memset(dp, 0x3f, sizeof dp);
  update(0, 0, 0, 0);
  for (int i = 0; i < k; ++i) {
    int len = leftt[i + 1] - rightt[i];
    int len2 = rightt[i + 1] - leftt[i + 1];
    for (int j = 0; j + len <= rightt[i + 1]; ++j) {
      int cur = query(i, j);
      if (cur == INF) continue;
      update(i + 1, j + len + len2, j + len + len2, cur);
      update(i + 1, rightt[i + 1] - j - len - len2, rightt[i + 1] - j - len,
             cur + 1);
      update(i + 1, j + len, j + len + len2, cur + 2);
    }
  }
  int ans = query(k, n);
  if (ans == INF)
    cout << "Hungry";
  else
    cout << "Full\n" << ans;
  return 0;
}
