// ROOT : DRAGON3012009 : WA in Real Life
#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define MAXN 205
#define ALPHA 26
#define Bit(i) (1LL << i )
#define INF (1ll<<30)
#define NAME "file"
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;

ll n, m, q, len, M ;
ll dp[MAXN][MAXN][MAXN ] ;
ll nxtA[MAXN][ALPHA] ;
ll nxtB[MAXN][ALPHA] ;
string a, b ;

ll Power(ll a, ll b ) {
    ll res = 1;
    while(b) {
        if(b&1) res = a*res%M;
        b>>=1;
        a=a*a%M;
    }
    return res;
}
ll add(ll a, ll b ) {
    return a + b >= M ? a + b - M : a + b;
}
ll mul(ll a, ll b )  {
    return 1LL * (a%M) * (b%M) % M;
}
ll sub(ll a, ll b ) {
    return a - b < 0 ? a - b + M : a - b;
}
ll divi(ll a, ll b) {
    return 1LL * a * Power(b, M - 2 ) % M;
}

ll DP(ll pos, ll khopA, ll khopB ) {
    if(pos > len ) {
        return khopA <= n && khopB > m ;
    }
    ll &cur = dp[pos][khopA][khopB ] ;
    if(cur != - 1 ) return cur ;
    cur = 0 ;

    REP(c, ALPHA ) {
        ll nxt_A = nxtA[khopA + 1 ][c ] ;
        ll nxt_B = nxtB[khopB + 1 ][c] ;
        if(khopB > m) nxt_B = khopB ;
        if(khopA > n) nxt_A = khopA ;

        cur = add(cur,  DP(pos + 1, nxt_A, nxt_B ) ) ;
    }
    return cur ;
}

void init() {
    cin >> q >> len >> M ;
    cin >> a >> b ;
    n = a.size() ;
    m = b.size() ;
    a = " " + a ;
    b = " " + b ;
    REP(i, ALPHA ) {
        nxtA[n + 1][i] = n + 1 ;
        nxtB[m + 1][i] = m + 1 ;
    }
    FORD(i, n, 1 ) {
        REP(j, ALPHA ) {
            if(a[i] - 'a' == j) nxtA[i][j] = i ;
            else nxtA[i][j] = nxtA[i + 1][j] ;
        }
    }
    FORD(i, m, 1 ) {
        REP(j, ALPHA ) {
            if(b[i] - 'a' == j) nxtB[i][j] = i ;
            else nxtB[i][j] = nxtB[i + 1][j] ;
        }
    }
}

bool checkTrue(string &tmp ) {
    tmp = " " + tmp ;
    ll ptr = 1 ;
    FOR(i, 1, n ) if(a[i] == tmp[ptr ] ) ptr ++ ;
    if(ptr <= len ) return false ;
    ptr = 1 ;
    FOR(i, 1,  m ) if(b[i] == tmp[ptr ] ) ptr ++ ;
    if(ptr > len ) return false ;
    return true ;
}

void solve() {
    memset(dp , -1 , sizeof dp ) ;
    DP(1 , 0 , 0 ) ;

    FOR(cnt, 1, q ) {
        string x ;
        cin >> x ;
        if(!checkTrue(x)) {
            cout << -1 << el ;
            continue ;
        }
        ll khopA = 0, khopB = 0 ;
        ll ans = 1 ;

        FOR(i, 1,  len ) {
            REP(c, x[i] - 'a') {
                ll nxt_A = nxtA[khopA + 1 ][c ] ;
                ll nxt_B = nxtB[khopB + 1 ][c] ;
                if(khopB > m) nxt_B = khopB ;
                if(khopA > n) nxt_A = khopA ;
                ans = add(ans, DP(i + 1, nxt_A, nxt_B )) ;
            }
            ll nxt_A = nxtA[khopA + 1 ][x[i] - 'a' ] ;
            ll nxt_B = nxtB[khopB + 1 ][x[i] - 'a' ] ;
            if(khopB > m) nxt_B = khopB ;
            if(khopA > n) nxt_A = khopA ;
            khopA = nxt_A, khopB = nxt_B ;
        }
        cout << ans << el ;
    }
}

_ROOT_ {
    // freopen(NAME".inp" , "r" , stdin);
    // freopen(NAME".out" , "w", stdout) ;
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1; // cin >> t ;
    while(t--) {
        init();
        solve();
    }
    return (0&0);
}
