#include <bits/stdc++.h>
using namespace std;
char buf[1 << 20], *p1, *p2;
template <class T>
inline void read(T &n) {
  char ch =
      (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)
           ? 0
           : *p1++);
  T w = 1, x = 0;
  while (!isdigit(ch)) {
    if (ch == '-') w = -1;
    ch =
        (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)
             ? 0
             : *p1++);
  }
  while (isdigit(ch)) {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch =
        (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)
             ? 0
             : *p1++);
  }
  n = x * w;
}
const int maxn = 200005;
int n, m, q;
char s[maxn];
int sa[maxn], rk[maxn], y[maxn];
void Rsort() {
  static int c[maxn];
  for (int i = 1; i <= m; i++) c[i] = 0;
  for (int i = 1; i <= n; i++) c[rk[i]]++;
  for (int i = 1; i <= m; i++) c[i] += c[i - 1];
  for (int i = n; i >= 1; i--) sa[c[rk[y[i]]]--] = y[i];
}
void getSA() {
  for (int i = 1; i <= n; i++) rk[i] = s[i], y[i] = i;
  m = 122, Rsort();
  for (int k = 1;; k <<= 1) {
    int num = 0;
    for (int i = n - k + 1; i <= n; i++) y[++num] = i;
    for (int i = 1; i <= n; i++)
      if (sa[i] > k) y[++num] = sa[i] - k;
    Rsort(), swap(rk, y);
    num = rk[sa[1]] = 1;
    for (int i = 2; i <= n; i++) {
      if (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k])
        rk[sa[i]] = num;
      else
        rk[sa[i]] = ++num;
    }
    if (num == n) return;
    m = num;
  }
}
int height[maxn], st[maxn][19], Log[maxn];
void getheight() {
  for (int i = 1, k = 0; i <= n; i++) {
    if (rk[i] == 1) continue;
    if (k) k--;
    int j = sa[rk[i] - 1];
    while (i + k <= n && j + k <= n && s[i + k] == s[j + k]) k++;
    height[rk[i]] = k;
  }
  for (int i = 2; i <= n; i++) Log[i] = Log[i >> 1] + 1;
  for (int i = 1; i <= n; i++) st[i][0] = height[i];
  for (int j = 1; j <= Log[n]; j++)
    for (int i = 1; i + (1 << j) - 1 <= n; i++)
      st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
int query(int l, int r) {
  if (rk[l] > rk[r]) swap(l, r);
  int L = rk[l] + 1, R = rk[r];
  int i = Log[R - L + 1];
  return min(st[L][i], st[R - (1 << i) + 1][i]);
}
int A[maxn], B[maxn], X, Y, bel[maxn];
int bot[maxn << 1], tot, S[maxn << 1], top, sum[maxn << 1], h[maxn << 1];
bool cmp(int x, int y) { return rk[x] < rk[y]; }
long long ans, f[maxn << 1];
void solve() {
  read(X), read(Y);
  ans = tot = 0;
  for (int i = 1; i <= X; i++) {
    read(A[i]);
    bel[A[i]] = 1, bot[++tot] = A[i];
  }
  for (int i = 1; i <= Y; i++) {
    read(B[i]);
    if (bel[B[i]])
      ans += n - B[i] + 1, bel[B[i]] = 3;
    else
      bel[B[i]] = 2, bot[++tot] = B[i];
  }
  sort(bot + 1, bot + tot + 1, cmp);
  top = 0;
  for (int i = 1; i <= tot; i++) sum[i] = sum[i - 1] + (bel[bot[i]] >= 2);
  for (int i = 1; i <= tot; i++) {
    h[i] = query(bot[i], bot[i - 1]);
    while (top && h[i] < h[S[top]]) top--;
    f[i] = f[S[top]] + 1ll * h[i] * (sum[i - 1] - sum[S[top] - 1]);
    if (bel[bot[i]] & 1) ans += f[i];
    S[++top] = i;
  }
  top = 0;
  for (int i = 1; i <= tot; i++) sum[i] = sum[i - 1] + (bel[bot[i]] & 1);
  for (int i = 1; i <= tot; i++) {
    while (top && h[i] < h[S[top]]) top--;
    f[i] = f[S[top]] + 1ll * h[i] * (sum[i - 1] - sum[S[top] - 1]);
    if (bel[bot[i]] >= 2) ans += f[i];
    S[++top] = i;
  }
  for (int i = 1; i <= X; i++) bel[A[i]] = 0;
  for (int i = 1; i <= Y; i++) bel[B[i]] = 0;
  printf("%lld\n", ans);
}
int main() {
  scanf("%d%d", &n, &q);
  scanf("%s", s + 1);
  getSA(), getheight();
  for (int i = 1; i <= q; i++) solve();
  return 0;
}
