#include <bits/stdc++.h>
using namespace std;
int n, Q, ban, exs, id[150005], fa[150005], len[150005], sum[150005],
    cnt[150005][26], f[150005][26];
char c[150005];
vector<int> G[150005];
void dfs(int u) {
  for (int v : G[u]) {
    dfs(v);
    if (len[u] && len[u] != len[v] + 1) {
      while (Q--) puts("Fou");
      exit(0);
    }
    len[u] = len[v] + 1;
  }
  id[u] = G[u].size() == 1 ? id[G[u][0]] : u;
}
void upd(int u, int c, int w) {
  cnt[u][c] += w;
  if (u == id[1]) exs += w;
  for (int x = fa[u]; x; x = fa[x]) {
    ban -= sum[x] > len[x];
    sum[x] -= f[x][c], f[x][c] = 0;
    for (int v : G[x]) f[x][c] = max(f[x][c], f[v][c] + cnt[v][c]);
    sum[x] += f[x][c];
    ban += sum[x] > len[x];
  }
}
int main() {
  scanf("%d%d", &n, &Q);
  for (int i = 2, x; i <= n; i++) scanf("%d %c", &x, &c[i]), G[x].push_back(i);
  dfs(1);
  for (int i = 1; i <= n; i++)
    if (id[i] == i)
      for (int &v : G[i]) fa[v = id[v]] = i;
  for (int i = 2; i <= n; i++)
    if (c[i] != '?') upd(id[i], c[i] - 'a', 1);
  for (int x; Q--;) {
    scanf("%d", &x);
    if (c[x] != '?') upd(id[x], c[x] - 'a', -1);
    getchar(), c[x] = getchar();
    if (c[x] != '?') upd(id[x], c[x] - 'a', 1);
    if (ban)
      puts("Fou");
    else {
      printf("Shi");
      int ans = 0, ext = len[1] - sum[id[1]] - exs;
      for (int i = 0; i < 26; i++)
        ans += (i + 1) * (f[id[1]][i] + cnt[id[1]][i] + ext);
      printf(" %d\n", ans);
    }
  }
}
