#include <bits/stdc++.h>
using namespace std;
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
template <typename T>
inline bool chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline T read() {
  register T sum(0), fg(1);
  register char ch(getchar());
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') fg = -1;
  for (; isdigit(ch); ch = getchar()) sum = sum * 10 - '0' + ch;
  return sum * fg;
}
const int MAXN = (int)1.5e5, alpha = 26;
int n, Q;
int fa[MAXN + 5], w[MAXN + 5], deg[MAXN + 5];
inline char safe_getchar() {
  register char ch(getchar());
  while (!isgraph(ch)) ch = getchar();
  return ch;
}
inline void input() {
  n = read<int>(), Q = read<int>();
  for (int i = 2; i <= n; ++i) {
    ++deg[fa[i] = read<int>()];
    w[i] = safe_getchar(), w[i] = w[i] == '?' ? -1 : w[i] - 'a';
  }
}
int len[MAXN + 5];
int pre[MAXN + 5], id[MAXN + 5], cnt[MAXN + 5][alpha];
int f[MAXN + 5][alpha];
vector<int> adj[MAXN + 5];
int sum[MAXN + 5];
inline void solve() {
  for (int i = n; i >= 2; --i) {
    if (len[fa[i]] > 0 && len[fa[i]] != len[i] + 1) {
      while (Q--) puts("Fou");
      return;
    }
    len[fa[i]] = len[i] + 1;
  }
  for (int i = 2; i <= n; ++i) {
    if (fa[i] == 1 || deg[fa[i]] > 1)
      pre[i] = fa[i], id[i] = i;
    else
      pre[i] = pre[fa[i]], id[i] = id[fa[i]];
    if (w[i] != -1) ++cnt[id[i]][w[i]];
  }
  for (int i = n; i >= 2; --i)
    if (deg[i] != 1) {
      for (int j = 0; j < alpha; ++j)
        chkmax(f[pre[i]][j], f[i][j] + cnt[id[i]][j]);
      adj[pre[i]].push_back(i);
    }
  int invalid = 0;
  for (int i = 1; i <= n; ++i) {
    sum[i] = 0;
    for (int j = 0; j < alpha; ++j) sum[i] += f[i][j];
    if (sum[i] > len[i]) ++invalid;
  }
  auto update = [&](int u, int w0) {
    if (w0 == -1) return;
    for (; u; u = pre[u]) {
      if (sum[u] > len[u]) --invalid;
      sum[u] -= f[u][w0];
      f[u][w0] = 0;
      for (auto v : adj[u]) chkmax(f[u][w0], f[v][w0] + cnt[id[v]][w0]);
      sum[u] += f[u][w0];
      if (sum[u] > len[u]) ++invalid;
    }
  };
  while (Q--) {
    int u = read<int>(), w0 = safe_getchar();
    w0 = w0 == '?' ? -1 : w0 - 'a';
    if (w[u] != -1) --cnt[id[u]][w[u]], update(id[u], w[u]);
    w[u] = w0;
    if (w0 != -1) ++cnt[id[u]][w0], update(id[u], w0);
    if (invalid > 0)
      puts("Fou");
    else {
      printf("Shi ");
      int res = 0;
      for (int i = 0; i < alpha; ++i)
        res += (i + 1) * (f[1][i] + len[1] - sum[1]);
      printf("%d\n", res);
    }
  }
}
int main() {
  input();
  solve();
  return 0;
}
