import std.stdio;
import std.ascii;
import std.range;
import std.array;
import std.functional;
import std.algorithm;
import std.conv;
import std.container;
import std.math;
import std.numeric;
import std.string;
import std.c.string;
import std.random;
import std.regex;
import std.typecons;

int N, T;
int[] L;

bool input() {
    int l, b;
    scanf("%d %d %d %d\n", &N, &T, &l, &b);
    if (N == 0 && T == 0 && l == 0 && b == 0) return false;
    L = new int[N + 1];
    foreach (i; 0 .. l) { int x; scanf("%d\n", &x); L[x] = 1; }
    foreach (i; 0 .. b) { int x; scanf("%d\n", &x); L[x] = -1; }
    return true;
}

void solve() {
    auto dp = new double[][](T + 3, N + 1);
    foreach (t; 0 .. T + 3) dp[t][] = 0;
    dp[0][0] = 1.0;
    for (int t = 0; t < T; t++) {
        //writeln(t, ": ", dp[t]);
        for (int i = 0; i < N; i++) {
            for (int d = 1; d <= 6; d++) {
                auto x = i + d;
                auto nt = t + 1;
                if (L[i] == 1) {
                    nt++;
                }
                if (x > N) x = 2 * N - x;
                if (L[x] == -1) {
                    x = 0;
                }
                dp[nt][x] += dp[t][i] / 6.0;
            }
        }
    }
    double ans = 0;
    foreach (t; 0 .. T + 1) ans += dp[t][N];
    writefln("%.10f", ans);
}

void main() {
    while (input) solve;
}