#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii ;
typedef pair<ll, ll> pll ;
typedef vector<pii> vii ;
typedef vector<int> veci ;
typedef vector<pll> vll ;
typedef vector<ll> vecll;
// find_by_order order_of_key
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define S second
#define pb push_back
#define endl '\n'
#define Mp make_pair
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " = " << x << endl
#define set_dec(x) cout << fixed << setprecision(x);
#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout);
#define lb lower_bound
#define ub upper_bound
#define for1(n) for(int i=1;i<=n;i++)
#define for0(n) for(int i=0;i<n;i++)
#define forn(n) for(int i=n;i>0;i--)
#define pq priority_queue <pii, vector<pii>, greater<pii>>
const ll mod = 1e9+9;
const int N=5e5+10,bs=701,L=20,bs2=719;
int n,m,k,q,rmq[N][L],mx[N][L];
vector<pii> vec[N];
ll pw[N],pre[N],inv[N],pw2[N],inv2[N],pre2[N];
pii seg[N*4];
typedef unsigned long long ull;
typedef __uint128_t LL;
struct FastMod {
ull b, m;
FastMod(ull b) : b(b), m(ull((LL(1) << 64) / b)) {}
ull red(ull a) {
ull q = (ull)((LL(m) * a) >> 64);
ull r = a - q * b;
return r >= b ? r - b : r;
}
};
FastMod F(mod);
void upd(int i,int l=0,int r=n,int v=1){
if(r-l==1){
seg[v]={mx[i][0],i};
return;
}
int mid=(l+r)>>1;
if(i<mid)upd(i,l,mid,v<<1);
else upd(i,mid,r,v<<1|1);
seg[v]=max(seg[v<<1],seg[v<<1|1]);
}
pii get(int lx,int rx,int l=0,int r=n,int v=1){
if(lx>=r || rx<=l)return {0,0};
if(lx<=l && r<=rx)return seg[v];
int mid=(l+r)>>1;
return max(get(lx,rx,l,mid,v<<1),get(lx,rx,mid,r,v<<1|1));
}
ll px(ll a,ll b){
ll ans=1;
while(b){
if(b&1)ans=F.red(ans*a);
b>>=1;
a=F.red(a*a);
}
return ans;
}
int main(){
fast_io
pw[0]=pw2[0]=1;
for1(N-1){
pw[i]=F.red(pw[i-1]*bs);
pw2[i]=F.red(pw2[i-1]*bs2);
}
inv[N-1]=px(pw[N-1],mod-2);
inv2[N-1]=px(pw2[N-1],mod-2);
for(int i=N-2;i>=0;i--){
inv[i]=F.red(inv[i+1]*bs);
inv2[i]=F.red(inv2[i+1]*bs2);
}
cin>>m>>q;
for1(m){
string s;cin>>s;
ll hs=0,hs2=0;;
for0(s.size()){hs=F.red(hs+pw[i]*s[i]);hs2=F.red(hs2+pw2[i]*s[i]);vec[i].pb({hs,hs2});}
}
string s;cin>>s;n=s.size();
for0(n){
sort(all(vec[i]));vec[i].resize(unique(all(vec[i]))-vec[i].begin());
vec[i].pb({mod,mod});
}
for0(n){pre[i]=F.red((i==0 ? 0:pre[i-1])+pw[i]*s[i]);pre2[i]=F.red((i==0 ? 0:pre2[i-1])+pw2[i]*s[i]);}
for(int i=n-1;i>=0;i--){
int l=i-1,r=n;
while(r-l!=1){
int mid=(l+r)>>1;
ll hs=F.red((pre[mid]-(i==0 ? 0:pre[i-1])+mod)*inv[i]),hs2=F.red((pre2[mid]-(i==0 ? 0:pre2[i-1])+mod)*inv2[i]);
if(Mp(int(hs),int(hs2))==(*lb(all(vec[mid-i]),Mp(int(hs),int(hs2)))))l=mid;
else r=mid;
}
mx[i][0]=l+1;
upd(i);
rmq[i][0]=get(i,mx[i][0]+1).S;
}
for0(L)rmq[n][i]=mx[n][i]=n;
for(int j=1;j<L;j++)for0(n){
mx[i][j]=max(mx[i][j-1],mx[rmq[i][j-1]][j-1]);
rmq[i][j]=rmq[rmq[i][j-1]][j-1];
}
while(q--){
int l,r;cin>>l>>r;r--;
int ans=1;
for(int j=L-1;j>=0;j--)if(mx[l][j]<=r){
ans+=1<<j;
l=rmq[l][j];
}
if(mx[l][0]<=r){
ans++;
l=rmq[l][0];
}
if(mx[l][0]<=r)ans=-1;
// for0(n){
// if(mx[l][0]>r)break;
// ans++;
// l=rmq[l][0];
// }
if(mx[l][0]<=r)ans=-1;
cout<<ans<<endl;
}
}