#include <bits/stdc++.h>
using namespace std;
int father[150010], dep[150010], new_fa[150010], head[150010], nxt[150010],
    a[150010], edge, h[150010], cnt, id[150010];
char c[150010];
int sum[150010][26], tot, height[150010], f[150010][26], sep[150010], g[150010],
    need;
vector<pair<int, int> > neigh[150010];
void create(int u, int v, char x) {
  edge++;
  a[edge] = v;
  nxt[edge] = head[u];
  head[u] = edge;
  c[edge] = x;
}
void dfs(int u, int fa) {
  dep[u] = dep[fa] + 1;
  int sum = 0;
  for (int i = head[u]; i; i = nxt[i]) sum++;
  if (sum == 0) {
    id[++cnt] = u;
    height[u] = 0;
  }
  if (u != 1 && sum == 1)
    new_fa[u] = new_fa[fa];
  else
    new_fa[u] = u;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = a[i];
    dfs(v, u);
    height[u] = height[v] + 1;
  }
}
void get_f(int u) {
  int len = neigh[u].size();
  for (int i = 0; i <= len - 1; i++) {
    pair<int, int> tmp = neigh[u][i];
    get_f(tmp.second);
    for (int j = 0; j <= 25; j++)
      f[u][j] = max(f[u][j], f[tmp.second][j] + sum[tmp.first][j]);
  }
  for (int i = 0; i <= 25; i++) g[u] += f[u][i];
  if (height[u] - g[u] < 0) need++;
}
void recalc(int u, char c) {
  if (c == '?') return;
  g[u] -= f[u][c - 'a'];
  f[u][c - 'a'] = 0;
  int len = neigh[u].size();
  for (int i = 0; i <= len - 1; i++) {
    pair<int, int> tmp = neigh[u][i];
    f[u][c - 'a'] =
        max(f[u][c - 'a'], f[tmp.second][c - 'a'] + sum[tmp.first][c - 'a']);
  }
  g[u] += f[u][c - 'a'];
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; i++) {
    scanf("%d", &father[i]);
    char x = getchar();
    while ((x < 'a' || x > 'z') && x != '?') x = getchar();
    create(father[i], i, x);
  }
  dfs(1, 0);
  for (int i = 2; i <= cnt; i++)
    if (dep[id[i]] != dep[id[i - 1]]) {
      for (int j = 1; j <= m; j++) puts("Fou");
      return 0;
    }
  for (int i = 1; i <= n; i++)
    if (new_fa[i] == i) {
      for (int j = head[i]; j; j = nxt[j]) {
        tot++;
        int cur = i;
        while (new_fa[cur] == i) {
          int id = head[cur];
          if (cur == i) id = j;
          if (c[id] != '?') sum[tot][c[id] - 'a']++;
          cur = a[id];
          sep[cur] = tot;
        }
        neigh[i].push_back(make_pair(tot, cur));
      }
    }
  get_f(1);
  for (int i = 1; i <= m; i++) {
    int x;
    char y;
    scanf("%d", &x);
    y = getchar();
    while ((y < 'a' || y > 'z') && y != '?') y = getchar();
    int cur = new_fa[x];
    if (c[x - 1] != '?') sum[sep[x]][c[x - 1] - 'a']--;
    if (y != '?') sum[sep[x]][y - 'a']++;
    while (cur) {
      if (height[cur] - g[cur] < 0) need--;
      recalc(cur, c[x - 1]);
      recalc(cur, y);
      if (height[cur] - g[cur] < 0) need++;
      cur = new_fa[father[cur]];
    }
    c[x - 1] = y;
    if (need)
      puts("Fou");
    else {
      int res = 0;
      for (int j = 0; j <= 25; j++)
        res += (j + 1) * (f[1][j] + height[1] - g[1]);
      printf("Shi %d\n", res);
    }
  }
  return 0;
}
