// I believe in Bobgy!!!!!!!!!!
#include <bits/stdc++.h>
using namespace std;
#define TR(i,v)         for(__typeof((v).begin())i=(v).begin();i!=(v).end();++i)
#define DEBUG(x)        cout << #x << " = "; cout << x << endl;
#define SIZE(p)         (int)(p).size()
#define MP(a, b)        make_pair((a), (b))
#define ALL(p)          (p).begin(), (p).end()
#define rep(i, n)       for(int (i)=0; (i)<(int)(n); ++(i))
#define REP(i, a, n)    for(int (i)=(a); (i)<(int)(n); ++(i))
#define FOR(i, a, b)    for(int (i)=(int)(a); (i)<=(int)(b); ++(i))
#define FORD(i, b, a)   for(int (i)=(int)(b); (i)>=(int)(a); --(i))
#define CLR(x, y)       memset((x), (y), sizeof((x)))
typedef long long LL;
typedef long long ll;
typedef pair<int, int> pii;
char buf;
inline char xchar() { while (buf = getchar(), isspace(buf)); return buf; }
inline int xint() { while (buf = getchar(), buf < '0' || buf > '9'); int x = buf - '0'; for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return x; }
inline ll xll() { while (buf = getchar(), buf < '0' || buf > '9'); ll x = buf - '0'; for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return x; }
inline string xstring() { while (buf = getchar(), buf == ' ' || buf == '\n'); string x = ""; for (x += buf; buf = getchar(), buf != ' ' && buf != '\n' && buf != '\r'; x += buf); return x; }
inline string xline() { while (buf = getchar(), buf == ' ' || buf == '\n'); string x = ""; for (x += buf; buf = getchar(), buf != '\n' && buf != '\r'; x += buf); return x; }
const int mod = 10007;
int n,W, C[1005], presum[1005], preL[1005], A[105];
int dp1[1005][1005], dp2[105][105][1005], dpsum[105][105][1005];
int wp[1005], m;
int Cb[105][105];
inline int add(int x,int y) {
    x+=y;   x%=mod;
    return x;
}
inline int mul(int x,int y) {
    x*=y;   x%=mod;
    return x;
}
int main(int argc, char const *argv[]) {
#ifndef ONLINE_JUDGE
  freopen("in", "r", stdin);
  freopen("F.out", "w", stdout);
#endif
    // ios::sync_with_stdio(false);		cin.tie(0);
    Cb[0][0]=1;
    FOR(i,1,100)
    FOR(j,0,i) {
        if(j==0)    Cb[i][j]=1;
        else    Cb[i][j]=add(Cb[i-1][j], Cb[i-1][j-1]);
    }
    int T;  scanf("%d", &T);
    FOR(cs,1,T) {
        printf("Case %d: ",cs);
        scanf("%d%d", &n,&W);
        CLR(C,0);
        FOR(i,1,n)      A[i]=xint(),++C[A[i]], wp[i]=A[i];
        sort(wp+1,wp+n+1);
        int *uf=unique(wp+1, wp+n+1); m=uf-wp-1;
        presum[0]=0;
        FOR(i,1,m)  presum[i]=presum[i-1]+C[wp[i]];      
        CLR(preL,0);
        FOR(i,0,m)  preL[wp[i]]=C[wp[i]];
        FOR(i,1,W)  preL[i]+=preL[i-1];
        int maxw=wp[m];      
        {
            dp1[0][0]=1;
            int k=1;
            FOR(i,1,W) {
                FOR(j,0,W) {
                    int &res=dp1[i][j];
                    res=0;
                    if(i==wp[k]) {
                        int sum=C[i]*i;
                        if(j>=sum)
                            res=mul(dp1[i-1][j-sum], Cb[presum[k]][C[i]]);
                    }else {
                        res=dp1[i-1][j];
                    }
                }
                if(i==wp[k])    ++k;
            }
        }
        {                
            FOR(k,0,n)
            FOR(j,0,W)
                dp2[m+1][k][j]=0;
            dp2[m+1][0][0]=1;
            FORD(i,m,1)
            FOR(k,0,n)
            FOR(j,0,W) {
                int &res=dp2[i][k][j];  res=0;
                int h=min(C[wp[i]], k);
                for(int c=0;c<=h && c*wp[i]<=j;++c) {
                    res=add(res, mul(dp2[i+1][k-c][j-c*wp[i]], Cb[k][c]));
                }
            }
        }
        int res=0;        
        FOR(l,0,maxw) {            
            int k=0, a=0, b=0, acnt=0;
            while(k+1<=m && wp[k+1]<=l) ++k, a+=wp[k]*C[wp[k]], acnt+=C[wp[k]];
            if(a>W-l)   continue;            
            int r=0;
            int i=k+1;
            {                
                b=W-l-a;
                FOR(k,0,n-acnt) {
                    r=add(r, mul(mul(dp1[l][a], dp2[i][k][b]), Cb[acnt+k][k]));
                }
            }            
            res=add(res,r);            
        }
        printf("%d\n",res);
    }
    return 0;
}
