#include <bits/stdc++.h>
using namespace std;
const int N = 150005;
int n, q, a, par[N], lit[N], rep[N], up[N], cnt[N][27], dp[N][27], bad[N], h[N],
    H;
vector<int> g[N];
char c;
int id(char x) {
  if ('a' <= x && x <= 'z') return x - 'a';
  return 26;
}
void dfs(int v) {
  for (auto it : g[v]) dfs(it);
  if ((int)g[v].size() == 1 && v != 1) {
    rep[v] = rep[g[v][0]];
    up[rep[v]] = v;
  } else {
    rep[v] = v;
    up[v] = v;
  }
  if ((int)g[v].size() == 0 && h[v] != H) {
    for (int i = 1; i <= q; ++i) printf("Fou\n");
    exit(0);
  }
}
int notok = 0;
void oblicz(int v) {
  if (bad[v]) notok--;
  bad[v] = false;
  for (auto it : g[v])
    if (bad[rep[it]]) {
      bad[v] = true;
      notok++;
      return;
    }
  if ((int)g[v].size() == 0) return;
  if ((int)g[v].size() == 1) {
    int u = rep[g[v][0]];
    for (int i = 0; i <= 26; ++i) dp[v][i] = dp[u][i] + cnt[u][i];
    return;
  }
  int u1 = rep[g[v][0]], u2 = rep[g[v][1]], s = 0;
  for (int i = 0; i <= 25; ++i) {
    dp[v][i] = max(dp[u1][i] + cnt[u1][i], dp[u2][i] + cnt[u2][i]);
    s += dp[v][i];
  }
  dp[v][26] = (H - h[v]) - s;
  if (dp[v][26] < 0) {
    bad[v] = true;
    notok++;
  }
}
void dfs2(int v) {
  for (auto it : g[v]) dfs2(rep[it]);
  oblicz(v);
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 2; i <= n; ++i) {
    scanf("%d %c", par + i, &c);
    h[i] = h[par[i]] + 1;
    H = max(H, h[i]);
    g[par[i]].push_back(i);
    lit[i] = id(c);
  }
  dfs(1);
  for (int i = 1; i <= n; ++i) cnt[rep[i]][lit[i]]++;
  dfs2(1);
  while (q--) {
    scanf("%d %c", &a, &c);
    cnt[rep[a]][lit[a]]--;
    lit[a] = id(c);
    cnt[rep[a]][lit[a]]++;
    a = par[up[rep[a]]];
    while (a) {
      oblicz(a);
      a = par[up[a]];
    }
    if (notok) {
      printf("Fou\n");
      continue;
    }
    int res = 0;
    for (int i = 0; i <= 25; ++i) res += (i + 1) * (dp[1][i] + dp[1][26]);
    printf("Shi %d\n", res);
  }
  return 0;
}
