using System.Collections.Generic;
public static void Main()
var result = new List<HashSet<int>>();
var graph = new Dictionary<int, HashSet<int>>();
var squares = new HashSet<int> { };
while (counter * counter <= 2 * n)
squares.Add(counter * counter);
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
if (squares.Contains(i + j))
if(!graph.ContainsKey(i))
graph.Add(i, new HashSet<int>());
if(!graph.ContainsKey(j))
graph.Add(j, new HashSet<int>());
foreach (var start in graph.Keys)
var candidates = new List<(HashSet<int>, int)> { (new HashSet<int> { start }, start) };
while (candidates.Count > 0)
var newCandidates = new List<(HashSet<int>, int)> { };
foreach (var (path, vertex) in candidates)
foreach (var candidate in graph[vertex])
if (!path.Contains(candidate))
var newPath = new HashSet<int>(path);
newCandidates.Add((newPath, candidate));
candidates = newCandidates;
foreach (var path in result)
var sb = new StringBuilder();
Console.WriteLine(sb.ToString());