#include <bits/stdc++.h>
int fa[200005], dep[200005], deg[200005], leaf[200005], tp[200005];
int app[200005][35], dp[200005][35], sum[200005], bad;
std::vector<int> vec[200005];
char faw[200005];
inline void update(int u, int c) {
  while (~u) {
    if (sum[u] > leaf[u]) bad--;
    sum[u] -= dp[u][c];
    dp[u][c] = 0;
    for (int v : vec[u])
      dp[u][c] = std::max(dp[u][c], dp[v][c] + app[tp[v]][c]);
    sum[u] += dp[u][c];
    if (sum[u] > leaf[u]) bad++;
    u = fa[tp[u]];
  }
}
int main() {
  int n, q;
  scanf("%d%d", &n, &q);
  fa[0] = -1;
  for (int i = 1; i < n; i++) {
    scanf("%d %c", fa + i, faw + i);
    dep[i] = dep[--fa[i]] + 1;
    deg[fa[i]]++;
  }
  for (int i = n - 1; i; i--) {
    if (leaf[fa[i]] && leaf[fa[i]] != leaf[i] + 1) {
      while (q--) puts("Fou");
      return 0;
    }
    leaf[fa[i]] = leaf[i] + 1;
  }
  for (int i = 0; i < n; i++) {
    if (deg[fa[i]] > 1 || !fa[i])
      tp[i] = i;
    else
      tp[i] = tp[fa[i]];
    if (i && faw[i] != '?') app[tp[i]][faw[i] - 'a']++;
  }
  for (int i = n - 1; i; i--) {
    if (deg[i] == 1) continue;
    for (int j = 0; j < 26; j++)
      dp[fa[tp[i]]][j] = std::max(dp[fa[tp[i]]][j], dp[i][j] + app[tp[i]][j]);
    vec[fa[tp[i]]].push_back(i);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 26; j++) sum[i] += dp[i][j];
    if (sum[i] > leaf[i]) bad++;
  }
  while (q--) {
    int u;
    char c;
    scanf("%d %c", &u, &c);
    if (faw[--u] != '?') {
      app[tp[u]][faw[u] - 'a']--;
      update(fa[tp[u]], faw[u] - 'a');
    }
    faw[u] = c;
    if (faw[u] != '?') {
      app[tp[u]][faw[u] - 'a']++;
      update(fa[tp[u]], faw[u] - 'a');
    }
    if (bad)
      puts("Fou");
    else {
      int val = 0;
      for (int i = 0; i < 26; i++)
        val += (dp[0][i] + leaf[0] - sum[0]) * (i + 1);
      printf("Shi %d\n", val);
    }
  }
  return 0;
}
