#include <bits/stdc++.h> using namespace std; using ll = long long; long long readInt(long long l,long long r,char endd){ long long x=0; int cnt=0; int fi=-1; bool is_neg=false; while(true){ char g=getchar(); if(g=='-'){ assert(fi==-1); is_neg=true; continue; } if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(fi!=0 || cnt==1); assert(fi!=0 || is_neg==false); assert(!(cnt>19 || ( cnt==19 && fi>1) )); } else if(g==endd){ if(is_neg){ x= -x; } assert(l<=x && x<=r); return x; } else { assert(false); } } } string readString(int l,int r,char endd){ string ret=""; int cnt=0; while(true){ char g=getchar(); assert(g!=-1); if(g==endd){ break; } cnt++; ret+=g; } assert(l<=cnt && cnt<=r); return ret; } long long readIntSp(long long l,long long r){ return readInt(l,r,' '); } long long readIntLn(long long l,long long r){ return readInt(l,r,'\n'); } string readStringLn(int l,int r){ return readString(l,r,'\n'); } string readStringSp(int l,int r){ return readString(l,r,' '); } long long P10(int x){ return x == 0 ? 1 : 10 * P10(x - 1); } template <typename T, typename R = long long> vector<T> readArr(int len, R l, R r){ vector<T> a(len); for(int i = 0; i < len; i++){ if(i + 1 < len){ a[i] = readIntSp(l, r); } else { a[i] = readIntLn(l, r); } } return a; } int add(int a, int b, int mod){ a += b; if(a >= mod) a -= mod; return a; } int mul(ll a, ll b, int mod){ return (a * b) % mod; } int main(){ int n = readIntSp(1, 2 * P10(3)); int k = readIntSp(1, 2 * P10(3)); int m = readIntSp(1, P10(9)); int mod = readIntLn(1, P10(9)); auto A = readArr<int>(n, 1, m); auto P = readArr<int>(n + k, 1, m); auto C = readArr<int>(n + k, -P10(9), P10(9)); const ll inf = 1ll<<60; vector<ll> best(n + 1, -inf); best[0] = 0; vector<vector<ll>> t; t.push_back(best); for(int i = 0; i < n + k; i++){ vector<ll> nbest(n + 1, -inf); auto pick = [&](int x, ll sum){ if(nbest[x] < sum){ nbest[x] = sum; } }; for(int j = 0; j <= n; j++){ pick(j, best[j] + C[i]); if(m > 1) { pick(j, best[j]); } if(j < n){ if(P[i] == A[j]){ pick(j + 1, best[j] + C[i]); } else { pick(j + 1, best[j]); } } } best = nbest; t.push_back(best); } vector<vector<int>> ways(n + k + 1, vector<int>(n + 1, 0)); ways[n + k][n] = 1; for(int i = n + k; i > 0; i--){ for(int j = 0; j <= n; j++){ if(j < n && P[i - 1] == A[j]){ int w = 1; if(t[i - 1][j] + C[i - 1] == t[i][j + 1]) { if(t[i - 1][j] == t[i][j]){ ways[i - 1][j] = add(ways[i - 1][j], mul(ways[i][j], m - w, mod), mod); } if(t[i - 1][j] + C[i - 1] == t[i][j + 1]) { ways[i - 1][j] = add(ways[i - 1][j], ways[i][j + 1], mod); } } else { if(t[i - 1][j] == t[i][j]){ ways[i - 1][j] = add(ways[i - 1][j], mul(ways[i][j], m - w, mod), mod); } if(t[i - 1][j] + C[i - 1] == t[i][j]) { ways[i - 1][j] = add(ways[i - 1][j], ways[i][j], mod); } } } else { if(j < n){ int w = 2; if(t[i - 1][j] == t[i][j]){ ways[i - 1][j] = add(ways[i - 1][j], mul(ways[i][j], m - w, mod), mod); } if(t[i - 1][j] + C[i - 1] == t[i][j]) { ways[i - 1][j] = add(ways[i - 1][j], ways[i][j], mod); } if(t[i - 1][j] == t[i][j + 1]) { ways[i - 1][j] = add(ways[i - 1][j], ways[i][j + 1], mod); } } else { int w = 1; if(t[i - 1][j] == t[i][j]){ ways[i - 1][j] = add(ways[i - 1][j], mul(ways[i][j], m - w, mod), mod); } if(t[i - 1][j] + C[i - 1] == t[i][j]) { ways[i - 1][j] = add(ways[i - 1][j], ways[i][j], mod); } } } } } cout << best[n] << ' ' << ways[0][0] << '\n'; return 0; }