from itertools import * from bisect import * from collections import * from heapq import * import sys sys.setrecursionlimit(10 ** 6) def II(): return int(sys.stdin.readline()) def MI(): return map(int, sys.stdin.readline().split()) def LI(): return list(map(int, sys.stdin.readline().split())) def SI(): return sys.stdin.readline()[:-1] def LLI(rows_number): return [LI() for _ in range(rows_number)] def LLI1(rows_number): return [LI1() for _ in range(rows_number)] int1 = lambda x: int(x) - 1 def MI1(): return map(int1, sys.stdin.readline().split()) def LI1(): return list(map(int1, sys.stdin.readline().split())) p2D = lambda x: print(*x, sep="\n") dij = [(1, 0), (0, 1), (-1, 0), (0, -1)] def main(): def ng(): print(-1) exit() a,b,c,d=MI() # aを村0「だけ」から、水を受け取る村の数 # bを村1「だけ」から、水を受け取る村の数にする a-=c b-=c # 不可能なパターン if a+b+c<2:ng() # すべての村が0,1から受け取る if a==0 and b==0: if c>d:ng() print(a+b+c,c) print(0,1) print(1,0) for i in range(2,c): print(1,i) # 村1「だけ」から受け取る村の数がない elif b==0: if a+c-1>d:ng() print(a+b+c,a+c-1) print(0,1) for i in range(2,a+1): print(0,i) for i in range(a+1,a+c): print(1,i) # 村0「だけ」から受け取る村の数がない elif a==0: if b+c-1>d:ng() print(a+b+c,b+c-1) print(1,0) for i in range(2,b+1): print(1,i) for i in range(b+1,b+c): print(0,i) # 両方から受け取る村がない elif c==0: if a+b-2>d:ng() print(a+b+c,a+b-2) for i in range(2,a+1): print(0,i) for i in range(a+1,a+b): print(1,i) # 全パターンある else: if a+b+c-1>d:ng() print(a+b+c,a+b+c-1) print(0,2) print(1,2) for i in range(3,2+a): print(0,i) for i in range(2+a,1+a+b): print(1,i) for i in range(1+a+b,a+b+c): print(2,i) main()