#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5e4 + 2;
int head[N], grp_edge[N][30], max1[N][30], grp[N], level[N], okfine = 0, sum[N],
                                                             dem = 0;
char edge[N];
bool cac = true;
vector<pair<int, char> > adj[N];
vector<int> adj_grp[N];
stack<pair<int, char> > lis;
void dfs(int x) {
  int i = 0, j;
  if (adj[x].size() == 0) {
    if (!okfine) {
      okfine = level[x];
    }
    if (okfine != level[x]) {
      cac = false;
    }
    while (lis.size()) {
      i = lis.top().first;
      if (lis.top().second != '?') {
        grp_edge[x][(int)(lis.top().second - 'a' + 1)]++;
      }
      grp[i] = x;
      lis.pop();
    }
    if (i) {
      adj_grp[head[i]].push_back(x);
      head[x] = head[i];
    }
  }
  if (adj[x].size() == 1) {
    level[adj[x][0].first] = level[x] + 1;
    lis.push({adj[x][0].first, edge[adj[x][0].first]});
    dfs(adj[x][0].first);
  }
  if (adj[x].size() == 2) {
    while (lis.size()) {
      i = lis.top().first;
      if (lis.top().second != '?') {
        grp_edge[x][(int)(lis.top().second - 'a' + 1)]++;
      }
      grp[i] = x;
      lis.pop();
    }
    if (i) {
      adj_grp[head[i]].push_back(x);
      head[x] = head[i];
    }
    level[adj[x][0].first] = level[x] + 1;
    lis.push({adj[x][0].first, edge[adj[x][0].first]});
    dfs(adj[x][0].first);
    level[adj[x][1].first] = level[x] + 1;
    lis.push({adj[x][1].first, edge[adj[x][1].first]});
    dfs(adj[x][1].first);
  }
}
void dfs1(int x) {
  int i, j;
  for (i = 0; i < adj_grp[x].size(); i++) {
    dfs1(adj_grp[x][i]);
    for (j = 1; j <= 26; j++) {
      max1[x][j] =
          max(max1[x][j], max1[adj_grp[x][i]][j] + grp_edge[adj_grp[x][i]][j]);
    }
  }
  for (j = 1; j <= 26; j++) {
    sum[x] += max1[x][j];
  }
  if (sum[x] > okfine - level[x]) {
    dem++;
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, i, j, k, l, q, ans, ans1;
  char x, x1;
  cin >> n >> q;
  for (i = 2; i <= n; i++) {
    cin >> head[i] >> edge[i];
    adj[head[i]].push_back({i, edge[i]});
  }
  dfs(1);
  dfs1(1);
  head[1] = 0;
  for (i = 1; i <= q; i++) {
    if (!cac) {
      cout << "Fou\n";
      continue;
    }
    cin >> j >> x;
    x1 = edge[j];
    if (edge[j] != '?') {
      grp_edge[grp[j]][(int)(edge[j] - 'a' + 1)]--;
    }
    edge[j] = x;
    if (edge[j] != '?') {
      grp_edge[grp[j]][(int)(edge[j] - 'a' + 1)]++;
    }
    k = grp[j];
    while (k != 1) {
      if (adj_grp[head[k]].size() == 2) {
        if (sum[head[k]] > okfine - level[head[k]]) {
          if (x1 != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x1 - 'a' + 1)];
            max1[head[k]][(int)(x1 - 'a' + 1)] =
                max(max1[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)],
                    max1[adj_grp[head[k]][1]][(int)(x1 - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][1]][(int)(x1 - 'a' + 1)]);
            sum[head[k]] += max1[head[k]][(int)(x1 - 'a' + 1)];
          }
          if (x != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x - 'a' + 1)];
            max1[head[k]][(int)(x - 'a' + 1)] =
                max(max1[adj_grp[head[k]][0]][(int)(x - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][0]][(int)(x - 'a' + 1)],
                    max1[adj_grp[head[k]][1]][(int)(x - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][1]][(int)(x - 'a' + 1)]);
            sum[head[k]] += max1[head[k]][(int)(x - 'a' + 1)];
          }
          if (sum[head[k]] <= okfine - level[head[k]]) {
            dem--;
          }
        } else {
          if (x1 != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x1 - 'a' + 1)];
            max1[head[k]][(int)(x1 - 'a' + 1)] =
                max(max1[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)],
                    max1[adj_grp[head[k]][1]][(int)(x1 - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][1]][(int)(x1 - 'a' + 1)]);
            sum[head[k]] += max1[head[k]][(int)(x1 - 'a' + 1)];
          }
          if (x != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x - 'a' + 1)];
            max1[head[k]][(int)(x - 'a' + 1)] =
                max(max1[adj_grp[head[k]][0]][(int)(x - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][0]][(int)(x - 'a' + 1)],
                    max1[adj_grp[head[k]][1]][(int)(x - 'a' + 1)] +
                        grp_edge[adj_grp[head[k]][1]][(int)(x - 'a' + 1)]);
            sum[head[k]] += max1[head[k]][(int)(x - 'a' + 1)];
          }
          if (sum[head[k]] > okfine - level[head[k]]) {
            dem++;
          }
        }
      } else {
        if (sum[head[k]] > okfine - level[head[k]]) {
          if (x1 != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x1 - 'a' + 1)];
            max1[head[k]][(int)(x1 - 'a' + 1)] =
                max1[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)] +
                grp_edge[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)];
            sum[head[k]] += max1[head[k]][(int)(x1 - 'a' + 1)];
          }
          if (x != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x - 'a' + 1)];
            max1[head[k]][(int)(x - 'a' + 1)] =
                max1[adj_grp[head[k]][0]][(int)(x - 'a' + 1)] +
                grp_edge[adj_grp[head[k]][0]][(int)(x - 'a' + 1)];
            sum[head[k]] += max1[head[k]][(int)(x - 'a' + 1)];
          }
          if (sum[head[k]] <= okfine - level[head[k]]) {
            dem--;
          }
        } else {
          if (x1 != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x1 - 'a' + 1)];
            max1[head[k]][(int)(x1 - 'a' + 1)] =
                max1[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)] +
                grp_edge[adj_grp[head[k]][0]][(int)(x1 - 'a' + 1)];
            sum[head[k]] += max1[head[k]][(int)(x1 - 'a' + 1)];
          }
          if (x != '?') {
            sum[head[k]] -= max1[head[k]][(int)(x - 'a' + 1)];
            max1[head[k]][(int)(x - 'a' + 1)] =
                max1[adj_grp[head[k]][0]][(int)(x - 'a' + 1)] +
                grp_edge[adj_grp[head[k]][0]][(int)(x - 'a' + 1)];
            sum[head[k]] += max1[head[k]][(int)(x - 'a' + 1)];
          }
          if (sum[head[k]] > okfine - level[head[k]]) {
            dem++;
          }
        }
      }
      k = head[k];
    }
    if (dem) {
      cout << "Fou\n";
    } else {
      ans = 0;
      ans1 = 0;
      for (j = 1; j <= 26; j++) {
        ans += max1[1][j] * j;
        ans1 += max1[1][j];
      }
      cout << "Shi " << ans + (okfine - ans1) * 27 * 13 << endl;
    }
  }
}
