#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, S = 27;
int n, m, w[N][S], dgr[N], faw[N], dep[N], mdep, rel[N], fa[N], dp[N][S],
    tot[N], failcnt;
int h1[N], ecnt1, nxt1[N], v1[N];
int h[N], ecnt, nxt[N], v[N];
void add1(int _u, int _v) {
  nxt1[++ecnt1] = h1[_u];
  v1[ecnt1] = _v;
  h1[_u] = ecnt1;
}
void add(int _u, int _v) {
  nxt[++ecnt] = h[_u];
  v[ecnt] = _v;
  h[_u] = ecnt;
}
int dfs(int u) {
  if (dgr[u] == 0) {
    if (mdep == 0)
      mdep = dep[u];
    else if (mdep != dep[u]) {
      for (int i = 1; i <= m; ++i) puts("Fou");
      exit(0);
    }
    rel[u] = u;
    return u;
  }
  int rt;
  for (int i = h1[u]; i; i = nxt1[i]) {
    dep[v1[i]] = dep[u] + 1;
    rt = dfs(v1[i]);
    if (v1[i] != rt)
      for (int j = 0; j < S; ++j) w[rt][j] += w[v1[i]][j];
    for (int j = 1; j < S; ++j) dp[u][j] = max(dp[u][j], dp[rt][j] + w[rt][j]);
    if (dgr[u] == 1 && u != 1) rel[u] = rt;
    if (dgr[u] == 2 || u == 1) {
      add(u, rt);
      fa[rt] = u;
    }
  }
  for (int i = 1; i < S; ++i) tot[u] += dp[u][i];
  failcnt += tot[u] > mdep - dep[u];
  if (dgr[u] == 2 || u == 1) rel[u] = u;
  return (dgr[u] == 1 ? rt : u);
}
void modify(int u, int s) {
  while (u) {
    failcnt -= tot[u] > mdep - dep[u];
    tot[u] -= dp[u][s];
    dp[u][s] = 0;
    for (int i = h[u]; i; i = nxt[i])
      dp[u][s] = max(dp[u][s], dp[v[i]][s] + w[v[i]][s]);
    tot[u] += dp[u][s];
    failcnt += tot[u] > mdep - dep[u];
    u = fa[u];
  }
}
void get_ans() {
  if (failcnt) {
    puts("Fou");
    return;
  }
  int cnt = 0, ans = 0;
  for (int i = 1; i < S; ++i) cnt += dp[1][i];
  for (int i = 1; i < S; ++i) ans += i * (mdep - cnt + dp[1][i]);
  printf("Shi %d\n", ans);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; ++i) {
    int x;
    char c;
    scanf("%d", &x);
    c = getchar();
    while (c != '?' && (c < 'a' || c > 'z')) c = getchar();
    add1(x, i);
    faw[i] = c == '?' ? 0 : c - 'a' + 1;
    w[i][faw[i]]++;
    dgr[x]++;
  }
  dfs(1);
  for (int i = 1; i <= m; ++i) {
    int x;
    char c;
    scanf("%d", &x);
    c = getchar();
    while (c != '?' && (c < 'a' || c > 'z')) c = getchar();
    w[rel[x]][faw[x]]--;
    if (faw[x]) modify(fa[rel[x]], faw[x]);
    faw[x] = c == '?' ? 0 : c - 'a' + 1;
    w[rel[x]][faw[x]]++;
    if (faw[x]) modify(fa[rel[x]], faw[x]);
    get_ans();
  }
  return 0;
}
