#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<cmath>
#include<climits>
#include<ctime>
#include<cstring>
#include<numeric>
#include<iomanip>

#define ALL(v) (v).begin(),(v).end()
#define REP(i,p,n) for(int i=p;i<(int)(n);++i)
#define rep(i,n) REP(i,0,n)
#define dump(a) (cerr << #a << "=" << (a) << endl)
#define DUMP(list) cout << "{ "; for(auto nth : list){ cout << nth << " "; } cout << "}" << endl;

using namespace std;

const int NONE = 0;
const int LOSE = 1;
const int BACK = 2;

int N, L, T, B;
vector< vector<double> > dp;
vector<int> board;

int main(){
  cout << setiosflags(ios::fixed) << setprecision(8) << endl;
  while(cin >> N >> T >> L >> B && N > 0){

    board.assign(N+1, NONE);
    dp.assign(T+3, vector<double>(N+1, 0.0));

    int i;
    rep(nth, L){
      cin >> i;
      board[i] = LOSE;
    }

    rep(nth, B){
      cin >> i;
      board[i] = BACK;
    }

    dp[0][0] = 1.0;

    REP( turn, 0, T){
      REP( pos, 0, N){
        if( dp[turn][pos] == 0.0){ continue; }
        REP( i, 1, 7 ){
          int npos = pos + i;
          int nturn = turn + 1;
          if( npos > N ){ npos = N - (npos - N); }
          if (board[npos] == LOSE ) { nturn += 1; }
          if (board[npos] == BACK ) { npos = 0; }
          dp[nturn][npos] += dp[turn][pos] * (1.0/6.0);

        }

      }

    }

    double ans = 0;
    rep(i, T+1){
      ans += dp[i][N];
    }

    cout << ans << endl;

  }

  return 0;

}
