#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &x) {
  int ch = 0, f = 0;
  x = 0;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = 1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
  if (f) x = -x;
}
const int N = 1000005;
vector<int> g[N], e[N];
int f[N][26], s[N][26], c[N], sum[N], id[N], fa[N], dep[N], n, q, lover;
inline void dfs(int u) {
  int tot = 0;
  for (int i = 0; i < (int)g[u].size(); i++) {
    int v = g[u][i];
    dfs(v), tot++, id[u] = id[v];
    if (dep[u] == -1)
      dep[u] = dep[v] + 1;
    else if (dep[u] != dep[v] + 1) {
      while (q--) puts("Fou");
      exit(0);
    }
  }
  if (dep[u] == -1) dep[u] = 0;
  if (tot != 1) {
    id[u] = u;
    for (int i = 0; i < (int)g[u].size(); i++) {
      int v = g[u][i];
      e[id[u]].push_back(id[v]), fa[id[v]] = u;
    }
  }
}
inline void gao(int u, int c) {
  lover -= sum[u] > dep[u];
  sum[u] -= f[u][c];
  f[u][c] = 0;
  for (int i = 0; i < (int)e[u].size(); i++)
    f[u][c] = max(f[u][c], f[e[u][i]][c] + s[e[u][i]][c]);
  sum[u] += f[u][c];
  lover += sum[u] > dep[u];
  if (u) gao(fa[u], c);
}
int main() {
  memset(dep, -1, sizeof(dep));
  read(n), read(q);
  for (int i = 2, x; i <= n; i++) {
    read(x), c[i] = getchar();
    g[x].push_back(i);
  }
  dfs(1);
  e[0].push_back(id[1]), fa[id[1]] = 0;
  for (int i = 2; i <= n; i++)
    if (c[i] != '?') {
      s[id[i]][c[i] - 'a']++;
      gao(fa[id[i]], c[i] - 'a');
    }
  while (q--) {
    int x;
    read(x);
    if (c[x] != '?') s[id[x]][c[x] - 'a']--, gao(fa[id[x]], c[x] - 'a');
    c[x] = getchar();
    if (c[x] != '?') s[id[x]][c[x] - 'a']++, gao(fa[id[x]], c[x] - 'a');
    if (lover)
      puts("Fou");
    else {
      int res = 0;
      for (int i = 0; i < 26; i++) res += (i + 1) * (f[0][i] + dep[1] - sum[0]);
      printf("Shi %d\n", res);
    }
  }
  return 0;
}
