/*
    博弈游戏
    2到20的数,两个人轮流取
    取数不能取之前已取过数的倍数,或之前取过的两个数的倍数之和
    给出当前的一个合法局面,问先手要赢的策略

    n<=20,比较明显的mask dp
    dp[mask]表示剩下mask表示的数,当前下手是赢还是输

    注意的是,多case,但是只算一次就行了,不用每个case都clear dp[]
    因为知道了当前局面,就能确定之前选了什么数了
*/
#include
<iostream>
#include
<cstring>
#include
<map>
#include
<algorithm>
#include
<stack>
#include
<queue>
#include
<cstring>
#include
<cmath>
#include
<string>
#include
<cstdlib>
#include
<vector>
#include
<cstdio>
#include
<set>
#include
<list>
#include
<numeric>
#include
<cassert>
#include
<sstream>
#include
<ctime>
#include
<bitset>
#include
<functional>

using namespace std;

char dp[1<<20];

void add(int &forbiden, int &multiple, int x)//forbiden为不能的位,multiple为之前选的那些数的倍数的位
{
    
for (int a = x; a <= 20 ; a += x) {
        forbiden 
|= 1<<a;
        multiple 
|= 1<<a;
        forbiden 
|= multiple<<a;
    }
}

bool win(int mask, int forbiden, int multiple, int x)
{
    
if (mask == 0) {
        dp[mask] 
= -1;
        
return false;
    }
    
if(dp[mask]) {
        
return dp[mask] > 0;
    }
    add(forbiden, multiple, x);
    
for (int i = 2; i <= 20; i++) {
        
if((mask & (1<<i-2)) == 0 || (forbiden&(1<<i)) )continue;
        
if (!win(mask ^ (1<<i-2), forbiden, multiple, i) )  {//这里提前退出了,有些子状态并没有算到
            return dp[mask] = 1;
        }
    }
    dp[mask] 
= -1;
    
return 0;
}

int main()
{
#ifndef ONLINE_JUDGE
    
//freopen("in","r",stdin);
    
//freopen("out","w",stdout);
#endif
    
    
int T, t = 1, n;
    
for (scanf("%d"&T); T--; ) {
        printf(
"Scenario #%d:\n", t++);
        scanf(
"%d"&n);
        vector
<int> vt, have;
        
int vi[30= {0}, mask = 0;
        
for (int i = 1,x; i <= n; i++) {
            scanf(
"%d"&x);
            vt.push_back(x);
            vi[x] 
= 1;
            mask 
|= 1<<(x-2);//
        }
        
int forbiden = 0, multiple = 0;
        
for (int i = 2; i <= 20; i++) {//给出一个数,肯定给出他的所有因子
            if (vi[i] || (forbiden & (1<<i)) ) continue;
            add(forbiden, multiple, i);
        }
    
//    fill(dp, dp+mask+1, 0);   不用每次都clear
        /*
            不要搞一次win(mask)
            然后取dp[mask ^ (1<<vt[i]-2),看win里面会提早退出的
            所以有些dp[mask']没算到,会为0
            不过取win(mask ^ (1<<vt[i]-2))就行吧
        
*/
        vector
<int> ans;
        
for (int i = 0; i < vt.size(); i++) {
            
if (!win(mask^(1<<vt[i]-2), forbiden, multiple, vt[i])) {
                ans.push_back(vt[i]);
            }
        }
        
if(ans.empty()) {
            puts(
"There is no winning move.");
        } 
else {
            printf(
"The winning moves are:");
            sort(ans.begin(), ans.end());
            
for (int i = 0; i < ans.size(); i++) {
                printf(
" %d", ans[i]);
            }
            puts(
".");
        }
        puts(
"");
    }
    
return 0;
}