#include<iostream>
#include<cstdio>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
/*
给你n个车站,M1个火车从车站1到车站n,M2个火车从车站n到车站1,问你在T时刻,从车站1到车站n,并且在车站的等待时间最少
dp[i][j]在i时刻,在第j个车站还要等多少时间
状态转移
1、等一分钟
2、往右走
3、往左走
*/
int maxn=1e9;
int dp[205][55];
int t[75];//等待时间
int train[205][55][2];//某时刻某车站是否有向左或向右的车
int n,T;
void work()
{
scanf("%d",&T);
for(int i=1; i<n; i++)scanf("%d",&t[i]);
int m1,x;
scanf("%d",&m1);
for(int i=0; i<m1; i++)
{
scanf("%d",&x);
train[x][1][0]=1;
int sum=0;
for(int j=1; j<n; j++)
{
sum+=t[j];
if(x+sum<=T)
train[x+sum][j+1][0]=1;
}
}
int m2;
scanf("%d",&m2);
for(int i=0; i<m2; i++)
{
scanf("%d",&x);
train[x][n][1]=1;
int sum=0;
for(int j=n-1; j>0; j--)
{
sum+=t[j];
if(x+sum<=T)
train[x+sum][j][1]=1;
}
}
}
void solve()
{
for(int i=1; i<=n-1; i++)dp[T][i]=maxn;
dp[T][n]=0;
for(int i=T-1; i>=0; i--)
for(int j=1; j<=n; j++)
{
dp[i][j]=dp[i+1][j]+1;
if(j<n&&train[i][j][0]&&i+t[j]<=T)
dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]);
if(j>1&&train[i][j][1]&&i+t[j-1]<=T)
dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]);
}
}
int main()
{
int kase=0;
while(~scanf("%d",&n)&&n)
{
memset(train,0,sizeof(train));
work();
solve();
printf("Case Number %d: ",++kase);
if(dp[0][1]>=maxn)printf("impossible\n");
else printf("%d\n",dp[0][1]);
}
return 0;
}