#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 9;
struct node {
  int to, nxt, w;
} dis[maxn];
int n, num, q, flag(1), leaf, tim;
int head[maxn], dep[maxn], par[maxn], pos[maxn], dfn[maxn], low[maxn];
void Add(int u, int v, int c) {
  dis[++num] = (node){v, head[u], c};
  head[u] = num;
}
int id[maxn], len[maxn];
void Dfs(int u) {
  if (!head[u]) {
    id[u] = u;
    if (!leaf)
      leaf = dep[u];
    else if (leaf != dep[u]) {
      while (q--) {
        puts("Fou");
      }
      exit(0);
    }
  }
  int sz(0);
  for (int i = head[u]; i; i = dis[i].nxt) {
    int v(dis[i].to);
    par[v] = dis[i].w;
    dep[v] = dep[u] + 1;
    Dfs(v);
    len[u] = len[v] + 1;
    ++sz;
  }
}
std::vector<int> G[maxn];
int fa[maxn];
void Dfs2(int u) {
  int sz(0);
  for (int i = head[u]; i; i = dis[i].nxt) {
    int v(dis[i].to);
    Dfs2(v);
    id[u] = id[v];
    ++sz;
  }
  if (sz >= 2 || !u) {
    id[u] = u;
    for (int i = head[u]; i; i = dis[i].nxt) {
      int v(dis[i].to);
      fa[id[v]] = u;
      G[u].push_back(id[v]);
    }
  }
}
int ban;
int cnt[maxn][27], _mx[maxn][27], sumc[maxn];
void Chkmax(int &x, int y) {
  if (y > x) x = y;
}
void Update(int x, int c, int val) {
  cnt[x][c] += val;
  for (int u = fa[x]; u != -1; u = fa[u]) {
    ban -= sumc[u] > len[u];
    sumc[u] -= _mx[u][c];
    _mx[u][c] = 0;
    for (int j = 0; j < G[u].size(); ++j) {
      int v(G[u][j]);
      Chkmax(_mx[u][c], cnt[v][c] + _mx[v][c]);
    }
    sumc[u] += _mx[u][c];
    ban += sumc[u] > len[u];
  }
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 2; i <= n; ++i) {
    int x;
    char c;
    scanf("%d", &x);
    scanf(" %c", &c);
    if (c == '?')
      Add(x, i, 0);
    else
      Add(x, i, c - 'a' + 1);
  }
  Add(0, 1, 0);
  Dfs(0);
  len[0]--;
  --leaf;
  Dfs2(0);
  fa[0] = -1;
  for (int i = 1; i <= n; ++i)
    if (par[i]) {
      Update(id[i], par[i], 1);
    }
  while (q--) {
    int x;
    char c;
    int v;
    scanf("%d", &x);
    scanf(" %c", &c);
    if (c == '?')
      v = 0;
    else
      v = c - 'a' + 1;
    if (par[x]) {
      Update(id[x], par[x], -1);
    }
    par[x] = v;
    if (par[x]) {
      Update(id[x], par[x], 1);
    }
    int num(0);
    for (int i = 1; i <= 26; ++i) {
      num += _mx[0][i];
    }
    if (ban)
      puts("Fou");
    else {
      printf("Shi ");
      int ans(0);
      for (int i = 1; i <= 26; ++i) {
        ans += i * (leaf - num + _mx[0][i]);
      }
      printf("%d\n", ans);
    }
  }
  return 0;
}
