#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
const int sigma = maxn;
const int HASH_CNT = 2;
int n;
char s[maxn];
unsigned long long Prime_Pool[] = {1998585857ul, 23333333333ul};
unsigned long long Seed_Pool[] = {146527, 19260817};
unsigned long long Mod_Pool[] = {1000000009, 998244353};
unsigned long long has1[26], has2[26];
struct Hash {
  unsigned long long Seed, Mod;
  unsigned long long bas[maxn];
  unsigned long long sum[26][maxn];
  int perm[sigma];
  void init(int seedIndex, int modIndex) {
    Seed = Seed_Pool[seedIndex];
    Mod = Mod_Pool[modIndex];
    bas[0] = 1;
    for (int i = 1; i <= n; i++) {
      bas[i] = bas[i - 1] * Seed % Mod;
    }
    for (int i = 1; i <= n; i++) {
      for (int j = 0; j < 26; j++) {
        sum[j][i] = (sum[j][i - 1] * Seed % Mod + (s[i] == j + 'a')) % Mod;
      }
    }
  }
  unsigned long long getHash(int ch, int l, int r) {
    return (sum[ch][r] - sum[ch][l - 1] * bas[r - l + 1] % Mod + Mod) % Mod;
  }
} hasher[HASH_CNT];
bool check(int l1, int r1, int l2, int r2) {
  for (int i = 0; i < HASH_CNT; i++) {
    for (int j = 0; j < 26; j++) {
      has1[j] = hasher[i].getHash(j, l1, r1);
      has2[j] = hasher[i].getHash(j, l2, r2);
    }
    sort(has1, has1 + 26);
    sort(has2, has2 + 26);
    for (int j = 0; j < 26; j++)
      if (has1[j] != has2[j]) {
        return false;
      }
  }
  return true;
}
int main() {
  int m, x, y, len;
  scanf("%d%d", &n, &m);
  scanf("%s", s + 1);
  for (int i = 0; i < HASH_CNT; i++) hasher[i].init(i, i);
  while (m--) {
    scanf("%d%d%d", &x, &y, &len);
    if (check(x, x + len - 1, y, y + len - 1))
      puts("YES");
    else
      puts("NO");
  }
  return 0;
}
