#############################
MyIsInfinite:=function(G)
local L;
if GeneratorsOfGroup(G)=[] then return true; fi;
L:=LowIndexSubgroupsFpGroup(G,6);
Apply(L,AbelianInvariants);
if 0 in Flat(L) then return true;
else return fail; fi;
end;
#############################

#############################
MyIsFinite:=function(G);
if MyIsInfinite(G)=true then return false; fi;
return IsFinite(G);
end;
#############################

#############################
MyIsBieberbach:=function(F)
local L;
L:=LowIndexSubgroupsFpGroup(F,6); #6 suffices for 3D groups
L:=Filtered(L,g->IsNormal(F,g));
L:=List(L,g->Image(IsomorphismFpGroup(g)));
L:=Filtered([1..Length(L)],i->AbelianInvariants(L[i])=[0,0,0] and Length(RelatorsOfFpGroup(L[i]))>=3);
if Length(L)>0 then return true; fi;;
return false;
end;
#############################

#############################
ManifoldType:=function(M)
local F;
F:=FundamentalGroup(M);
if MyIsInfinite(F)=true then
  if MyIsBieberbach(F) then return "euclidean";
  else return "other"; fi;
fi;
if MyIsFinite(F)=true then return "spherical";
else return fail; fi;
end; 
#############################


gap> List(OrientableManifolds,ManifoldType);
[ "euclidean", "other", "other", "spherical", "other", "euclidean", 
  "euclidean", "spherical", "other", "spherical", "spherical", "spherical", 
  "spherical", "euclidean", "spherical", "spherical", "euclidean", "other" ]
