#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
int n, q, id[200005], dep[200005], cnt[200005][26], ban, f[200005][26],
    sum[200005], fa[200005];
vector<int> e[200005], G[200005];
char c[200005];
void dfs(int x) {
  int son = 0, siz = e[x].size();
  for (int i = 0; i < siz; i++) {
    int v = e[x][i];
    ++son;
    dfs(v);
    if (dep[x] && dep[x] != dep[v] + 1) {
      while (q--) puts("Fou");
      exit(0);
    }
    dep[x] = dep[v] + 1;
    id[x] = id[v];
  }
  if (son != 1 || !x) {
    id[x] = x;
    for (int i = 0; i < siz; i++) {
      int v = e[x][i];
      fa[id[v]] = x;
      G[x].push_back(id[v]);
    }
  }
}
void modify(int x, int ch, int w) {
  cnt[x][ch] += w;
  for (x = fa[x]; x; x = fa[x]) {
    ban -= sum[x] > dep[x];
    sum[x] -= f[x][ch];
    f[x][ch] = 0;
    int siz = G[x].size();
    for (int i = 0; i < siz; i++)
      f[x][ch] = max(f[x][ch], f[G[x][i]][ch] + cnt[G[x][i]][ch]);
    sum[x] += f[x][ch];
    ban += sum[x] > dep[x];
  }
}
int main() {
  n = read();
  q = read();
  for (int i = 2; i <= n; i++) {
    int x = read();
    c[i] = getchar();
    e[x].push_back(i);
  }
  dfs(1);
  for (int i = 2; i <= n; i++)
    if (c[i] != '?') modify(id[i], c[i] - 'a', 1);
  while (q--) {
    int x = read();
    if (c[x] != '?') modify(id[x], c[x] - 'a', -1);
    c[x] = getchar();
    if (c[x] != '?') modify(id[x], c[x] - 'a', 1);
    if (ban)
      puts("Fou");
    else {
      printf("Shi ");
      int ans = 0, now = 0;
      for (int i = 0; i <= 25; i++) now += f[id[1]][i] + cnt[id[1]][i];
      for (int i = 0; i <= 25; i++)
        ans += (f[id[1]][i] + cnt[id[1]][i] + dep[1] - now) * (i + 1);
      printf("%d\n", ans);
    }
  }
  return 0;
}
