using System; using System.Linq; using System.Collections.Generic; using System.Text; public class Program { public void Proc() { Reader.IsDebug =false; int[] inpt = Reader.ReadLine().Split(' ').Select(a=>int.Parse(a)).ToArray(); if(inpt[0] == inpt[1] && inpt[0] == inpt[2] && inpt[2] < 2) { Console.WriteLine(-1); return; } Mura m0 = new Mura(); Mura m1 = new Mura(); if(inpt[0] == inpt[1] && inpt[0] == inpt[2]) { m0.AddRange(inpt[0] - 2); m0.Add(m1); m1.Add(m0); } else if(inpt[0] == inpt[2]) { m0.AddRange(inpt[2] - 1); m1.Add(m0); m1.AddRange(inpt[1] - 1 - inpt[2]); } else if(inpt[1] == inpt[2]) { m1.AddRange(inpt[2] - 1); m0.Add(m1); m0.AddRange(inpt[0] - 1 - inpt[2]); } else if(inpt[2] == 0) { m0.AddRange(inpt[0] - 1); m1.AddRange(inpt[1] - 1); } else { m0.AddRange(inpt[0] - 1 - inpt[2]); m1.AddRange(inpt[1] - 1 - inpt[2]); Mura hub = new Mura(); hub.AddRange(inpt[2]-1); m0.Add(hub); m1.Add(hub); } string ans = Mura.GetAns(); if(Mura.RoadCount > inpt[3]) { Console.WriteLine(-1); return; } Console.WriteLine(Mura.MuraList.Count + " " + Mura.RoadCount); if(Mura.RoadCount > 0) { Console.Write(ans); } } public class Mura { public static int RoadCount; public static String GetAns() { RoadCount = 0; string tmp1 = MuraList[0].PrintRoad(); string tmp2 = MuraList[1].PrintRoad(); return tmp1 + tmp2; } public static List MuraList = new List(); public int ID = -1; public List Items = new List(); private bool IsPrinted = false; public Mura() { this.ID = MuraList.Count; MuraList.Add(this); } public Mura Add() { Mura m = new Mura(); this.Items.Add(m); return m; } public Mura Add(Mura chld) { this.Items.Add(chld); return chld; } public string PrintRoad() { if(this.IsPrinted) { return string.Empty; } IsPrinted = true; StringBuilder ans = new StringBuilder(); foreach(Mura cld in this.Items) { ans.AppendLine(this.ID + " " + cld.ID); RoadCount++; ans.Append(cld.PrintRoad()); } return ans.ToString(); } public List AddRange(int count) { List ret = new List(); if(count == 0) { return ret; } for(int i=0; i