#include <bits/stdc++.h>
using namespace std;
int pai[1000] = {-1};
int visitados = 0;
bool errou = false;
void dfs(int at, vector<vector<int> >& g, vector<int>& visitado,
         set<int>& ciclo, int vAnt) {
  if (visitado[at] < 2) {
    if (visitado[at] == 1) {
      if (!errou) {
        ciclo.insert(at);
        int cur = vAnt;
        while (cur != at) {
          ciclo.insert(cur);
          cur = pai[cur];
        }
        errou = true;
        return;
      } else {
        return;
      }
    }
    pai[at] = vAnt;
    visitado[at] = 1;
    for (int viz : g[at]) {
      if (viz != vAnt) dfs(viz, g, visitado, ciclo, at);
    }
    visitado[at] = 2;
  } else {
    return;
  }
}
bool checkArvore(int at, vector<vector<int> >& g, vector<int>& visitado,
                 set<int>& ciclo, int vAnt) {
  if (!visitado[at]) {
    visitados++;
    visitado[at] = true;
    bool resp = true;
    for (int viz : g[at]) {
      if (viz != vAnt) {
        if ((ciclo.find(at) != ciclo.end() && ciclo.find(viz) == ciclo.end()) ||
            ciclo.find(at) == ciclo.end())
          resp &= checkArvore(viz, g, visitado, ciclo, at);
      }
    }
    return resp;
  } else {
    return false;
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int> > g(n);
  int a, b;
  for (int I = 0; I < m; I++) {
    cin >> a >> b;
    a--;
    b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  vector<int> visitado(n, 0);
  set<int> ciclo;
  dfs(0, g, visitado, ciclo, 0);
  bool v = true;
  for (int vCicl : ciclo) {
    visitado = vector<int>(n, 0);
    v &= checkArvore(vCicl, g, visitado, ciclo, vCicl);
  }
  if (v && ciclo.size() && visitados == n) {
    cout << "FHTAGN!" << endl;
  } else {
    cout << "NO" << endl;
  }
  return 0;
}
