The reason that I suggested that you search for other topics on the subject is that it will give you examples of how to use millis() for non blocking timing that would allow the button press to be detected whilst the timing periods are occuring
Whilst it is true that millis() should be used with unsigned long variables there is more to it than that
Maybe start by looking at Using millis() for timing. A beginners guide
Once you have got the hang of using millis() for timing then look into state machines. The sketch will be in one of several states displaying LED combinations and millis() is used for the timing. Button presses are detected and acted upon in the loop() function that is running freely dues to non blocking timing being used
I really do urge you to search the forum for previous topics on traffic lights