#include <bits/stdc++.h>
using namespace std;
const int N = 150005, sgm = 26;
vector<int> sum(vector<int> a, vector<int> b) {
  for (int i = 0; i < sgm; i++) a[i] += b[i];
  return a;
}
int n, q, nxt[N], par[N], ind[N], len[N], sm[N];
int vat = 0;
char up[N];
vector<int> val[N], str[N];
pair<int, int> pos[N];
vector<pair<int, vector<int>>> g[N], G[N];
void dfs1(int v, int id = 0) {
  ind[v] = id;
  str[v] = vector<int>(sgm);
  nxt[v] = v;
  len[v] = 0;
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i].first;
    if (g[v].size() == 1)
      par[to] = par[v];
    else {
      par[to] = v;
      id = i;
    }
    dfs1(to, id);
    if (g[v].size() == 1) {
      nxt[v] = nxt[to];
      str[v] = sum(g[v][i].second, str[to]);
    }
    G[v].push_back(make_pair(nxt[to], sum(g[v][i].second, str[to])));
    len[v] = len[to] + 1;
  }
}
void norm(int v) {
  if (sm[v] > len[v]) vat--;
  sm[v] = 0;
  val[v] = vector<int>(sgm);
  for (int i = 0; i < G[v].size(); i++) {
    vector<int> now = sum(G[v][i].second, val[G[v][i].first]);
    for (int j = 0; j < sgm; j++) val[v][j] = max(val[v][j], now[j]);
  }
  for (int j = 0; j < sgm; j++) sm[v] += val[v][j];
  if (sm[v] > len[v]) vat++;
}
void DFS(int v) {
  val[v] = vector<int>(sgm);
  for (int i = 0; i < G[v].size(); i++) {
    int to = G[v][i].first;
    DFS(to);
  }
  norm(v);
}
void upd(int v, char x) {
  char oldx = up[v];
  if (oldx == x) return;
  int V = par[v];
  vector<int> &s = G[V][ind[v]].second;
  if (up[v] != '?') s[up[v] - 'a']--;
  up[v] = x;
  if (up[v] != '?') s[up[v] - 'a']++;
  v = V;
  while (v) {
    if (sm[v] > len[v]) vat--;
    if (oldx != '?') {
      int nw = 0;
      for (int i = 0; i < G[v].size(); i++)
        nw = max(nw,
                 G[v][i].second[oldx - 'a'] + val[G[v][i].first][oldx - 'a']);
      sm[v] += (nw - val[v][oldx - 'a']);
      val[v][oldx - 'a'] = nw;
    }
    if (x != '?') {
      int nw = 0;
      for (int i = 0; i < G[v].size(); i++)
        nw = max(nw, G[v][i].second[x - 'a'] + val[G[v][i].first][x - 'a']);
      sm[v] += (nw - val[v][x - 'a']);
      val[v][x - 'a'] = nw;
    }
    if (sm[v] > len[v]) vat++;
    v = par[v];
  }
}
int main() {
  cin >> n >> q;
  for (int i = 2; i <= n; i++) {
    int p;
    scanf("%d", &p);
    scanf(" %c", up + i);
    vector<int> s(sgm);
    if (up[i] != '?') s[up[i] - 'a']++;
    g[p].push_back(make_pair(i, s));
  }
  par[1] = 1;
  dfs1(1);
  DFS(1);
  par[1] = 0;
  while (q--) {
    int v;
    char x;
    scanf("%d", &v);
    scanf(" %c", &x);
    upd(v, x);
    int ans = 0;
    for (int i = 0; i < sgm; i++) ans += (i + 1) * (val[1][i] + len[1] - sm[1]);
    if (vat == 0)
      printf("Shi %d\n", ans);
    else
      printf("Fou\n");
  }
  return 0;
}
