#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
template <class T>
T toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
int nint() {
  int x;
  scanf("%d", &x);
  return x;
}
int m;
int n;
long long ans;
string s;
vector<int> v;
vector<int> vv[26];
const int MAXN = 26 * 200500;
long long mod = 1000000000ll * 1000000000ll + 3;
long long q[MAXN], rq[MAXN];
long long h[MAXN];
long long q0;
inline long long mul(long long a, long long b) {
  long long q = (long double)a * b / mod;
  long long res = a * b - q * mod;
  while (res < 0) res += mod;
  while (res >= mod) res -= mod;
  return res;
}
long long st(long long x, long long p) {
  long long ans = 1;
  while (p) {
    if (p & 1) ans = mul(ans, x);
    x = mul(x, x);
    p /= 2;
  }
  return ans;
}
inline long long rev(long long a) { return st(a, mod - 2); }
void prep(long long a) {
  q[0] = rq[0] = 1;
  long long ra = rev(a);
  for (int i = 1; i < MAXN; i++) {
    q[i] = mul(q[i - 1], a);
    rq[i] = mul(rq[i - 1], ra);
  }
  q0 = q[1];
}
void build(vector<int>& s, long long* hh) {
  long long h = 0;
  for (int i = 0; i < (((int)(s).size())); i++) {
    h = (mul(h, q0) + s[i]) % mod;
    hh[i] = h;
  }
}
long long get(int l, int r, long long* hh) {
  long long ans = hh[r];
  if (l) {
    ans -= mul(hh[l - 1], q[r - l + 1]);
    if (ans < 0) ans += mod;
  }
  return ans;
}
int checkSubstr(int p1, int p2, int len) {
  return get(p1, p1 + len - 1, h) == get(p2, p2 + len - 1, h);
}
vector<int> get(int p, int len) {
  vector<pair<int, int> > v;
  for (int i = 0; i < (26); i++) {
    int pos = lower_bound((vv[i]).begin(), (vv[i]).end(), p) - vv[i].begin();
    if (pos < ((int)(vv[i]).size()) && vv[i][pos] < p + len)
      v.emplace_back(vv[i][pos], i);
    else
      v.emplace_back(-1, i);
  }
  sort((v).begin(), (v).end());
  vector<int> ans;
  for (int i = 0; i < (((int)(v).size())); i++)
    if (v[i].first != -1) ans.emplace_back(v[i].second);
  return ans;
}
int check(int p1, int p2, int d) {
  vector<int> v1 = get(p1, d);
  vector<int> v2 = get(p2, d);
  if (((int)(v1).size()) != ((int)(v2).size())) return 0;
  for (int i = 0; i < (((int)(v1).size())); i++) {
    int x = v1[i];
    int y = v2[i];
    if (!checkSubstr(x * n + p1, y * n + p2, d)) return 0;
  }
  return 1;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  cin >> s;
  for (int i = 0; i < (n); i++) vv[s[i] - 'a'].emplace_back(i);
  for (int c = 0; c < (26); c++)
    for (int i = 0; i < (n); i++) v.emplace_back(s[i] == c + 'a');
  prep(1009);
  build(v, h);
  for (int i = 0; i < (m); i++) {
    int p1, p2, d;
    cin >> p1 >> p2 >> d;
    p1--;
    p2--;
    if (check(p1, p2, d))
      cout << "YES\n";
    else
      cout << "NO\n";
  }
}
