#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, q, tot, last, rt[N], cnt;
char s[N], ans[N];
vector<int> e[N];
struct Node {
  int fa, len, tr[26];
} a[N << 1];
namespace Seg {
int tot;
struct Tree {
  int lc, rc, val;
} t[N << 5];
void up_(int o) { t[o].val = t[t[o].lc].val + t[t[o].rc].val; }
int merge_(int u, int v, int l, int r) {
  if (!u || !v) return u + v;
  int x = ++tot;
  if (l == r) {
    t[x].val = t[u].val + t[v].val;
    return x;
  }
  int mid = (l + r) >> 1;
  t[x].lc = merge_(t[u].lc, t[v].lc, l, mid);
  t[x].rc = merge_(t[u].rc, t[v].rc, mid + 1, r);
  return up_(x), x;
}
void ins_(int &o, int l, int r, int x) {
  if (!o) o = ++tot;
  if (l == r) {
    t[o].val = 1;
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    ins_(t[o].lc, l, mid, x);
  else
    ins_(t[o].rc, mid + 1, r, x);
  up_(o);
}
bool ask_(int o, int l, int r, int x, int y) {
  if (!o) return 0;
  if (x <= l && r <= y) return t[o].val;
  int mid = (l + r) >> 1;
  if (x <= mid && ask_(t[o].lc, l, mid, x, y)) return 1;
  if (mid < y && ask_(t[o].rc, mid + 1, r, x, y)) return 1;
  return 0;
}
}  // namespace Seg
void extend_(int k, int id) {
  int x = ++tot, p = last;
  a[x].len = a[p].len + 1;
  while (p && !a[p].tr[k]) a[p].tr[k] = x, p = a[p].fa;
  if (!p)
    a[x].fa = 1;
  else {
    int q = a[p].tr[k];
    if (a[p].len + 1 == a[q].len)
      a[x].fa = q;
    else {
      a[++tot] = a[q], a[tot].len = a[p].len + 1;
      a[q].fa = a[x].fa = tot;
      while (p && a[p].tr[k] == q) a[p].tr[k] = tot, p = a[p].fa;
    }
  }
  last = x, Seg ::ins_(rt[x], 1, n, id);
}
void dfs_(int u) {
  for (int v, i = 0; i < (int)e[u].size(); i++)
    v = e[u][i], dfs_(v), rt[u] = Seg ::merge_(rt[u], rt[v], 1, n);
}
bool solve_(int k, int u, int l, int r) {
  int v;
  if (k > m) {
    for (int i = 0; i < 26; i++)
      if (a[u].tr[i]) {
        v = a[u].tr[i], ans[++cnt] = ('a' + i);
        if (Seg ::ask_(rt[v], 1, n, l + k - 1, r)) {
          for (int j = 1; j <= cnt; j++) printf("%c", ans[j]);
          puts("");
          return 1;
        }
        cnt--;
      }
    return 0;
  }
  if (a[u].tr[s[k] - 'a']) {
    v = a[u].tr[s[k] - 'a'];
    if (Seg ::ask_(rt[v], 1, n, l + k - 1, r)) {
      ans[++cnt] = s[k];
      if (solve_(k + 1, v, l, r)) return 1;
      cnt--;
    }
  }
  for (int i = 0; i < 26; i++)
    if (i > s[k] - 'a' && a[u].tr[i]) {
      v = a[u].tr[i], ans[++cnt] = 'a' + i;
      if (Seg ::ask_(rt[v], 1, n, l + k - 1, r)) {
        for (int j = 1; j <= cnt; j++) printf("%c", ans[j]);
        puts("");
        return 1;
      }
      --cnt;
    }
  return 0;
}
int main() {
  scanf("%s%d", s + 1, &q);
  n = strlen(s + 1), last = tot = 1;
  for (int i = 1; i <= n; i++) extend_(s[i] - 'a', i);
  for (int i = 2; i <= tot; i++) e[a[i].fa].push_back(i);
  dfs_(1);
  for (int l, r, i = 1; i <= q; i++) {
    scanf("%d%d%s", &l, &r, s + 1);
    m = strlen(s + 1), cnt = 0;
    if (!solve_(1, 1, l, r)) puts("-1");
  }
}
