/*
ID: niepeng1
PROG: milk4
LANG: C++
*/
/*
解法很巧妙:
从牛奶桶数目较小到较大递归,然后通过从小到大选择牛奶桶来使第一个
产生的组合满足要求。
然后判断牛奶桶能组成目标牛奶数目的时候,通过取牛奶桶的最大公约数,
如果目标牛奶数是最大公约数的倍数,直接放弃。(不懂,待研究)
否则,就基本动归了,每次记录用某些牛奶同能达到所有牛奶数目。
*/
#include <stdio.h>
#include <algorithm>
#include <memory.h>
int q,n,num,pail[100],ans[100],temp[100];
bool yet,check[20001];
int gcd(int x,int y)
{
int t;
while(x%y)
{
t=x%y;
x=y;
y=t;
}
return y;
}
void judge()
{
int s=pail[ans[0]],i,j,t;
for(i=1;i<num;i++)
{
s=gcd(s,pail[ans[i]]);
if(s==1) break;
}
if(q%s) return;
for(i=0;i<num;i++) temp[i]=pail[ans[i]]/s;
t=q/s;
memset(check,false,sizeof(check));
check[0]=true;
for(i=1;i<=t;i++)
for(j=0;j<num&&temp[j]<=i;j++)
if(check[i-temp[j]])
{
check[i]=true;
break;
}
if(!check[t]) return;
printf("%d",num);
for(i=0;i<num;i++)
printf(" %d",pail[ans[i]]);
printf("/n");
yet=true;
}
void make(int t,int sp)
{
if(yet) return;
if(t==num) judge();
else
for(ans[t]=sp;ans[t]<=n+t-num;ans[t]++)
make(t+1,ans[t]+1);
}
int main()
{
int i;
freopen("milk4.in","r",stdin);
freopen("milk4.out","w",stdout);
scanf("%d%d",&q,&n);
for(i=0;i<n;i++) scanf("%d",&pail[i]);
std::sort(pail,pail+n);
yet=false;
for(num=1;num<=n;num++)
{
make(0,0);
if(yet) break;
}
return 0;
}