#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
struct SAM {
  int n, tot, last;
  int ch[N][26], dep[N], fa[N];
  int root[N], ls[N * 20], rs[N * 20], cnt;
  vector<int> G[N];
  void init() {
    tot = last = 1;
    memset(ch[1], 0, sizeof(ch[1]));
  }
  inline int newnode(int _dep) {
    dep[++tot] = _dep;
    memset(ch[tot], 0, sizeof(ch[tot]));
    return tot;
  }
  void add(int alp) {
    ++n;
    alp -= 'a';
    int u, p = newnode(dep[last] + 1);
    for (u = last; u && !ch[u][alp]; u = fa[u]) ch[u][alp] = p;
    if (!u)
      fa[p] = 1;
    else {
      int v = ch[u][alp];
      if (dep[v] == dep[u] + 1)
        fa[p] = v;
      else {
        int nv = newnode(dep[u] + 1);
        fa[nv] = fa[v];
        fa[v] = fa[p] = nv;
        memcpy(ch[nv], ch[v], sizeof(ch[v]));
        for (; u && ch[u][alp] == v; u = fa[u]) ch[u][alp] = nv;
      }
    }
    last = p;
  }
  int build(int l, int r, int p) {
    if (l == r) return ++cnt;
    int mid = l + r >> 1;
    int now = ++cnt;
    if (p <= mid)
      ls[now] = build(l, mid, p);
    else
      rs[now] = build(mid + 1, r, p);
    return now;
  }
  int merge(int x, int y) {
    if (x == 0 || y == 0) return x + y;
    int now = ++cnt;
    ls[now] = merge(ls[x], ls[y]);
    rs[now] = merge(rs[x], rs[y]);
    return now;
  }
  void dfs(int x) {
    for (int i = 0; i < G[x].size(); ++i) {
      int u = G[x][i];
      dfs(u);
      root[x] = merge(root[x], root[u]);
    }
  }
  void build_segtree(char* s) {
    int now = 1;
    int n = strlen(s + 1);
    for (int i = 1; i <= n; ++i) {
      now = ch[now][s[i] - 'a'];
      root[now] = build(1, n, i);
    }
    for (int i = 1; i <= tot; ++i) G[fa[i]].push_back(i);
    dfs(1);
  }
  string ans;
  bool chk(int k, int l, int r, int p, int q) {
    if (k == 0) return false;
    if (l >= p && r <= q) return true;
    if (l > q || r < p) return false;
    int mid = l + r >> 1;
    return chk(ls[k], l, mid, p, q) || chk(rs[k], mid + 1, r, p, q);
  }
  bool check(int l, int r, int p) { return chk(p, 1, n, l, r); }
  bool solve(int now, int l, int r, char* s) {
    if (l > r) return false;
    if (*s == 0) {
      for (int i = 0; i < 26; i++) {
        if (ch[now][i] && check(l, r, root[ch[now][i]])) {
          ans.push_back('a' + i);
          return true;
        }
      }
      return false;
    } else {
      int i = *s - 'a';
      if (ch[now][i] && check(l, r, root[ch[now][i]]) &&
          solve(ch[now][i], l + 1, r, s + 1)) {
        ans.push_back('a' + i);
        return true;
      }
      for (i = i + 1; i < 26; ++i) {
        if (ch[now][i] && check(l, r, root[ch[now][i]])) {
          ans.push_back('a' + i);
          return true;
        }
      }
      return false;
    }
  }
} sam;
int n, m;
char s[N];
int main() {
  sam.init();
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i <= n; i++) sam.add(s[i]);
  sam.build_segtree(s);
  scanf("%d", &m);
  while (m--) {
    int l, r;
    scanf("%d %d %s", &l, &r, s + 1);
    sam.ans.clear();
    if (!sam.solve(1, l, r, s + 1))
      printf("-1\n");
    else {
      reverse(sam.ans.begin(), sam.ans.end());
      printf("%s\n", sam.ans.c_str());
    }
  }
}
