#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void chkmax(T &a, T b) {
  if (a < b) a = b;
}
template <class T>
inline void chkmin(T &a, T b) {
  if (a > b) a = b;
}
inline int read() {
  int sum = 0, p = 1;
  char ch = getchar();
  while (!(('0' <= ch && ch <= '9') || ch == '-')) ch = getchar();
  if (ch == '-') p = -1, ch = getchar();
  while ('0' <= ch && ch <= '9') sum = sum * 10 + ch - 48, ch = getchar();
  return sum * p;
}
const int maxn = 2e5 + 20;
int n, q;
int fa[maxn], son[maxn], ed[maxn][2], deep[maxn];
int faw[maxn][27];
struct Union {
  int fa[maxn];
  inline void Init() {
    for (int i = (1), _end_ = (n); i <= _end_; i++) fa[i] = i;
  }
  inline int fin(int x) { return x == fa[x] ? x : fa[x] = fin(fa[x]); }
  inline void merge(int x, int y) {
    x = fin(x);
    y = fin(y);
    fa[y] = x;
  }
  inline int operator()(int x) { return fin(x); }
} A;
int f[maxn][27], ok[maxn], dep[maxn], sum[maxn];
void dfs(int u) {
  if (!ed[u][0] && !ed[u][1]) return ok[u] = 1, void();
  for (int j = (0), _end_ = (26); j <= _end_; j++) f[u][j] = 0;
  ok[u] = 1;
  for (int i = (0), _end_ = (1); i <= _end_; i++) {
    int v = ed[u][i];
    dfs(v);
    ok[u] &= ok[v];
    for (int j = (0), _end_ = (26); j <= _end_; j++)
      chkmax(f[u][j], f[v][j] + faw[v][j]);
  }
  for (int j = (1), _end_ = (26); j <= _end_; j++) sum[u] += f[u][j];
  if (sum[u] > f[u][0]) ok[u] &= 0;
}
char FAW[maxn];
inline void init() {
  n = read();
  q = read();
  A.Init();
  for (int i = (2), _end_ = (n); i <= _end_; i++) {
    fa[i] = read();
    ed[fa[i]][son[fa[i]]] = i;
    son[fa[i]]++;
    char ch;
    scanf("%c", &ch);
    FAW[i] = ch;
    faw[i][0]++;
    if (ch != '?') faw[i][ch - 'a' + 1]++;
    deep[i] = deep[fa[i]] + 1;
  }
  int first = -1;
  for (int i = (1), _end_ = (n); i <= _end_; i++)
    if (!son[i]) {
      if (first == -1 || first == deep[i])
        first = deep[i];
      else {
        for (int j = (1), _end_ = (q); j <= _end_; j++) puts("Fou");
        exit(0);
      }
    }
  for (int i = (2), _end_ = (n); i <= _end_; i++) {
    if (fa[i] > 1 && son[fa[i]] == 1) {
      int ff = fa[i];
      A.merge(i, ff);
      fa[i] = fa[ff];
      for (int j = (0), _end_ = (26); j <= _end_; j++) faw[i][j] += faw[ff][j];
      ed[fa[i]][ed[fa[i]][1] == ff] = i;
    }
  }
  dfs(1);
}
inline void update(int x, int ch, int d) {
  faw[A(x)][ch] += d;
  int u = fa[A(x)];
  while (u) {
    sum[u] -= f[u][ch];
    f[u][ch] = 0;
    ok[u] = 1;
    for (int i = (0), _end_ = (1); i <= _end_; i++) {
      int v = ed[u][i];
      ok[u] &= ok[v];
      chkmax(f[u][ch], f[v][ch] + faw[v][ch]);
    }
    sum[u] += f[u][ch];
    if (sum[u] > f[u][0]) ok[u] &= 0;
    u = fa[u];
  }
}
inline void doing() {
  for (int i = (1), _end_ = (q); i <= _end_; i++) {
    int x = read();
    char ch;
    scanf("%c", &ch);
    if (FAW[x] != '?') update(x, FAW[x] - 'a' + 1, -1);
    FAW[x] = ch;
    if (ch != '?') update(x, ch - 'a' + 1, 1);
    if (ok[1]) {
      int wh = f[1][0];
      for (int j = (1), _end_ = (26); j <= _end_; j++) wh -= f[1][j];
      long long ans = 0;
      for (int j = (1), _end_ = (26); j <= _end_; j++)
        ans += (f[1][j] + wh) * j;
      printf("Shi %lld\n", ans);
    } else
      puts("Fou");
  }
}
int main() {
  init();
  doing();
  return 0;
}
