The solution using Google OR-tools:
#!/usr/bin/python3
# pip install ortools
# https://pypi.org/project/ortools/
from ortools.constraint_solver import pywrapcp
def main():
solver = pywrapcp.Solver("PE_142")
max_limit=1000000
max_limit_sqr=(max_limit*2)**2
x=solver.IntVar(0, max_limit, "x")
y=solver.IntVar(0, max_limit, "y")
z=solver.IntVar(0, max_limit, "z")
a1=solver.IntVar(0, max_limit_sqr, "a1")
a2=solver.IntVar(0, max_limit_sqr, "a2")
a3=solver.IntVar(0, max_limit_sqr, "a3")
a4=solver.IntVar(0, max_limit_sqr, "a4")
a5=solver.IntVar(0, max_limit_sqr, "a5")
a6=solver.IntVar(0, max_limit_sqr, "a6")
solver.Add(x>y)
solver.Add(y>z)
solver.Add(z>0)
solver.Add(a1>0)
solver.Add(a2>0)
solver.Add(a3>0)
solver.Add(a4>0)
solver.Add(a5>0)
solver.Add(a6>0)
solver.Add(x + y == a1*a1)
solver.Add(x - y == a2*a2)
solver.Add(x + z == a3*a3)
solver.Add(x - z == a4*a4)
solver.Add(y + z == a5*a5)
solver.Add(y - z == a6*a6)
# objective
objective = solver.Minimize(x+z+y, 1)
solution = solver.Assignment()
db = solver.Phase([x,y,z],
solver.CHOOSE_MIN_SIZE_LOWEST_MAX,
solver.ASSIGN_MIN_VALUE)
solver.NewSearch(db, [objective])
assert solver.NextSolution()==True
print("x: ", x.Value())
print("y: ", y.Value())
print("z: ", z.Value())
print()
solver.EndSearch()
print("failures:", solver.Failures())
print("branches:", solver.Branches())
print("WallTime:", solver.WallTime())
main()
% my_time.py ./1.py ['./1.py'] x: 434657 y: 420968 z: 150568 failures: 215193 branches: 430387 WallTime: 457060 ['/home/i/dotfiles/bin/my_time.py', './1.py'] seconds: 457 or: 7m37s
Thanks to HÃ¥kan Kjellerstrand for his snippets, including those for OR-tools, which are so easy to study and modify...
Z3 SMT solver should work as well, but don't.

Yes, I know about these lousy Disqus ads. Please use adblocker. I would consider to subscribe to 'pro' version of Disqus if the signal/noise ratio in comments would be good enough.