#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;
}