#include <bits/stdc++.h>
using namespace std;
int gi() {
  int x = 0, w = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') w = 0, ch = getchar();
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  return w ? x : -x;
}
const int N = 150005;
int n, q, len[N], pos[N], fa[N], dp[N][26], cnt[N][26], sum[N], ban;
char ch[N];
vector<int> E[N], son[N];
int dfs(int u) {
  int sz = 0;
  for (int v : E[u]) {
    ++sz;
    pos[u] = dfs(v);
    if (len[u] && len[u] != len[v] + 1) {
      while (q--) puts("Fou");
      exit(0);
    }
    len[u] = len[v] + 1;
  }
  if (!sz) pos[u] = u;
  if (!u || sz > 1) {
    pos[u] = u;
    for (int v : E[u]) fa[pos[v]] = u, son[u].push_back(pos[v]);
  }
  return pos[u];
}
void update(int u, int v, int w) {
  cnt[u][v] += w;
  for (int x = fa[u]; ~x; x = fa[x]) {
    ban -= sum[x] > len[x];
    sum[x] -= dp[x][v];
    dp[x][v] = 0;
    for (int y : son[x]) dp[x][v] = max(dp[x][v], dp[y][v] + cnt[y][v]);
    sum[x] += dp[x][v];
    ban += sum[x] > len[x];
  }
}
int main() {
  n = gi();
  q = gi();
  for (int i = 2; i <= n; ++i) E[gi()].push_back(i), ch[i] = getchar();
  E[0].push_back(1);
  dfs(0);
  --len[0];
  fa[0] = -1;
  for (int i = 2; i <= n; ++i)
    if (ch[i] != '?') update(pos[i], ch[i] - 'a', 1);
  while (q--) {
    int x = gi();
    if (ch[x] != '?') update(pos[x], ch[x] - 'a', -1);
    ch[x] = getchar();
    if (ch[x] != '?') update(pos[x], ch[x] - 'a', 1);
    if (ban)
      puts("Fou");
    else {
      int ans = 0;
      for (int i = 0; i < 26; ++i)
        ans += (i + 1) * (len[0] - sum[0] + dp[0][i]);
      printf("Shi %d\n", ans);
    }
  }
  return 0;
}
