#include <bits/stdc++.h>
using namespace std;
int n;
int q;
vector<int> v[150002];
vector<char> c[150002];
int d[150002][26];
bool ok[150002];
int REST[150002];
int belong[150002];
int to[150002];
int f[150002];
int cn[150002][26];
int dep[150002];
inline void init(int b, int d = 0) {
  dep[b] = d;
  for (int go : v[b]) {
    init(go, d + 1);
  }
}
inline bool dfs(int b, int pr, int rest) {
  memset(d[b], 0, sizeof(d[b]));
  ok[b] = true;
  REST[b] = rest - dep[b];
  int idx = 0;
  for (int go : v[b]) {
    if (dfs(go, b, rest) == false) {
      ok[b] = false;
    }
    for (int j = 0; j < 26; j++) {
      d[b][j] = max(d[b][j], d[go][j] + cn[belong[go]][j]);
    }
    idx++;
  }
  int sm = 0;
  for (int j = 0; j < 26; j++) {
    sm += d[b][j];
  }
  if (sm > REST[b]) {
    ok[b] = false;
  }
  return ok[b];
}
bool ng;
set<int> ddd;
inline void check(int b, int pr = -1, int d = 0) {
  bool leaf = true;
  for (int go : v[b]) {
    if (go == pr) continue;
    leaf = false;
    check(go, b, d + 1);
  }
  if (leaf == true) {
    ddd.insert(d);
  }
}
char buf[5];
vector<pair<int, int> > info;
void upd_node(int b) {
  memset(d[b], 0, sizeof(d[b]));
  ok[b] = true;
  int idx = 0;
  for (int go : v[b]) {
    if (ok[go] == false) {
      ok[b] = false;
    }
    for (int j = 0; j < 26; j++) {
      d[b][j] = max(d[b][j], d[go][j] + cn[belong[go]][j]);
    }
    idx++;
  }
  int sm = 0;
  for (int j = 0; j < 26; j++) {
    sm += d[b][j];
  }
  if (sm > REST[b]) {
    ok[b] = false;
  }
  return;
}
int pr[150002];
void upd(int node) {
  while (node != -1) {
    upd_node(node);
    node = pr[node];
  }
}
void shorten() {
  for (int i = 0; i < n; i++) {
    belong[i] = i;
    f[i] = pr[i];
    to[i] = i;
  }
  belong[0] = -1;
  for (int i = 1; i < n; i++) {
    if (v[i].size() == 1) {
      belong[v[i][0]] = belong[i];
      to[belong[i]] = v[i][0];
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < v[i].size(); j++) {
      if (c[i][j] != '?') {
        cn[belong[v[i][j]]][c[i][j] - 'a']++;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    v[i].clear();
  }
  for (int i = 0; i < n; i++) {
    if (belong[i] == i) {
      v[f[i]].push_back(to[i]);
    }
  }
}
inline int maxi(int b, int z = 0, int p = -1) {
  int ret = z;
  pr[b] = p;
  for (int go : v[b]) {
    ret = max(ret, maxi(go, z + 1, b));
  }
  return ret;
}
int main() {
  cin >> n >> q;
  pr[0] = -1;
  for (int i = 1; i < n; i++) {
    int a;
    scanf("%d", &a);
    a--;
    scanf("%s", buf);
    pr[i] = a;
    char cc = buf[0];
    v[a].push_back(i);
    c[a].push_back(cc);
    info.push_back(make_pair(a, v[a].size() - 1));
  }
  init(0, 0);
  check(0);
  if (ddd.size() != 1) {
    for (int i = 0; i < q; i++) {
      puts("Fou");
    }
    return 0;
  }
  shorten();
  dfs(0, -1, (*ddd.begin()));
  maxi(0);
  while (q--) {
    int ty;
    scanf("%d", &ty);
    scanf("%s", buf);
    ty -= 2;
    {
      int f = info[ty].first;
      int i = info[ty].second;
      int be = belong[ty + 1];
      char &cng = c[f][i];
      if (cng != '?') {
        cn[be][cng - 'a']--;
      }
      c[f][i] = buf[0];
      if (cng != '?') {
        cn[be][cng - 'a']++;
      }
    }
    upd(f[belong[ty + 1]]);
    bool ok2 = ok[0];
    if (ok2 == false) {
      puts("Fou");
      continue;
    }
    long long int s = (*ddd.begin());
    for (int el : d[0]) {
      s -= el;
    }
    long long int ans = 0;
    for (int i = 0; i < 26; i++) {
      ans += (d[0][i] + s) * (long long int)(i + 1);
    }
    printf("Shi %lld\n", ans);
  }
  return 0;
}
