/*
魔法串
模拟题,两字符串从前到后扫描,
如果当前字符相等,两字符同时向后移动一位
否则,b字符是否能转化成前一个字符
直到结束
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define maxn 1000+10
int map['z'+10]['z'+10];
char a[maxn],b[maxn];
int main()
{
int t,n;
char ch1,ch2;
int Case=0;
scanf("%d",&t);
int i,j;
while(t--)
{
scanf("%s",a+1);
scanf("%s",b+1);
scanf("%d",&n);
// for(int i='a';i<='z';i++)
// map[i]=i;
memset(map,0,sizeof(map));
for( i=1;i<=n;i++)
{
cin>>ch1>>ch2;
map[ch1][ch2]=1;
// map[ch2][ch1]=1;
}
// for(int i='a';i<='z';i++)
// printf("%c",map[i]);
int len1=strlen(a+1);
int len2=strlen(b+1);
//for(i=1;i<=len1;i++)
// for(j=1;j<=len2;j++)
i=1;
j=1;
while(i<=len1 && j<=len2)
{
if(a[i]==b[j] || map[b[j]][a[i]] )
{
i++;
}
// else
// break;
j++;
}
if(i>len1)
printf("Case #%d: happy\n",++Case);
else
printf("Case #%d: unhappy\n",++Case);
}
return 0;
}
//从第二串第一个开始
//与第一串的第一个匹配如果相同就比下一个,
//不同看能不能改成相同,改不成就删掉。就这样一直到最后。
/*
比赛难度
将题目按照难度排序。
这题状态可以记录为两个值,a:当前所取的总难度和,b:最后取的一道题的题号。
那么从这个状态拓展的下一个最有可能的状态就是
1:去掉第b道题,取第b+1道题;
2:取现在状态所取的所有题加上第b+1道题。
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int N=10000+100;
struct Item
{
int sum,index;
bool operator<(const Item& a)const{
return (sum>a.sum || sum==a.sum && index>a.index); //从小到大排序
}
};
priority_queue<Item> q;
int v[N];
int main()
{
int t,n,m;
Item item;
int a,b;
int Case=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
sort(v+1,v+n+1);
while(!q.empty())
q.pop();
item.sum=v[1];
item.index=1;
q.push(item);
int count=0;
int ans=1;
while(!q.empty())
{
item=q.top();
q.pop();
count++;
if(count>=m)
{
//printf("%d\n",);
ans =item.sum;
break;
}
a=item.sum;
b=item.index;
if(b<n)
{
item.sum=a-v[b]+ v[b+1];
item.index=b+1;
q.push(item);
item.sum=a + v[b+1];
item.index=b+1;
q.push(item);
}
}
printf("Case #%d: %d\n",Case++,ans);
}
return 0;
}