#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
inline long long read() {
  long long x = 0, y = 0, c = getchar();
  while (!isdigit(c)) y = c, c = getchar();
  while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ '0'), c = getchar();
  return y == '-' ? -x : x;
}
inline void print(long long q) {
  if (q < 0) putchar('-'), q = -q;
  if (q >= 10) print(q / 10);
  putchar(q % 10 + '0');
}
long long s1 = 19260817, s2 = 23333333, s3 = 998244353, srd;
inline long long rd() { return srd = (srd * s1 + s2 + rand()) % s3; }
void file() {
  freopen(".in", "r", stdin);
  freopen(".out", "w", stdout);
}
int n, m, len;
int fa[150010], ls[150010], rs[150010], dpt[150010], zf[150010], mx[150010][27],
    bhf, sm[150010], ff[150010], sl[150010][27];
inline void dfs(int q) {
  len = max(len, dpt[q]);
  if (q != 1 && fa[q] != 1 && !rs[fa[q]]) fa[q] = fa[fa[q]];
  if (ls[q]) dpt[ls[q]] = dpt[q] + 1, dfs(ls[q]);
  if (rs[q]) dpt[rs[q]] = dpt[q] + 1, dfs(rs[q]);
  if (q == 1 || !ls[q] || rs[q])
    ff[q] = q;
  else
    ff[q] = ff[ls[q]];
  ++sl[ff[q]][zf[q]];
  ls[q] = ff[ls[q]];
  rs[q] = ff[rs[q]];
  if (ff[q] == q) {
    for (int i = 1; i <= 26; ++i) {
      mx[q][i] = max(mx[ls[q]][i] + sl[ls[q]][i], mx[rs[q]][i] + sl[rs[q]][i]);
    }
    for (int i = 1; i <= 26; ++i) sm[q] += mx[q][i];
    if ((q == 1 || rs[q]) && sm[q] + dpt[q] > len) ++bhf;
  }
}
inline bool chk() {
  for (int i = 1; i <= n; ++i)
    if (!ls[i] && dpt[i] != len) return 0;
  return 1;
}
int main() {
  srand(time(0));
  rd();
  int i, j;
  char c;
  n = read();
  m = read();
  for (i = 2; i <= n; ++i) {
    fa[i] = read();
    if (ls[fa[i]])
      rs[fa[i]] = i;
    else
      ls[fa[i]] = i;
    c = getchar();
    while ((c < 'a' || c > 'z') && c != '?') c = getchar();
    if (c != '?') zf[i] = c - 'a' + 1;
  }
  dfs(1);
  if (!chk()) {
    for (i = 1; i <= m; ++i) puts("Fou");
    return 0;
  }
  for (i = 1; i <= m; ++i) {
    j = read();
    --sl[ff[j]][zf[j]];
    c = getchar();
    while ((c < 'a' || c > 'z') && c != '?') c = getchar();
    int q1 = zf[j], q2 = 0;
    if (c != '?')
      zf[j] = q2 = c - 'a' + 1;
    else
      zf[j] = 0;
    ++sl[ff[j]][zf[j]];
    j = fa[j];
    while (j) {
      if (sm[j] + dpt[j] > len) --bhf;
      if (q1) sm[j] -= mx[j][q1];
      if (q2) sm[j] -= mx[j][q2];
      mx[j][q1] =
          max(mx[ls[j]][q1] + sl[ls[j]][q1], mx[rs[j]][q1] + sl[rs[j]][q1]);
      mx[j][q2] =
          max(mx[ls[j]][q2] + sl[ls[j]][q2], mx[rs[j]][q2] + sl[rs[j]][q2]);
      if (q1) sm[j] += mx[j][q1];
      if (q2) sm[j] += mx[j][q2];
      if (sm[j] + dpt[j] > len) ++bhf;
      j = fa[j];
    }
    if (bhf)
      puts("Fou");
    else {
      printf("Shi ");
      int as = 0;
      for (int l = 1; l <= 26; ++l) as += l * (mx[1][l] + len - sm[1]);
      print(as);
      putchar('\n');
    }
  }
  return 0;
}
