Implement a first-in-first-out (FIFO) queue using only two stacks. The queue should support the following operations: `push`, `pop`, `peek`, and `empty`.
You are given an array of commands, where each command is one of:
- `["push", x]` - Push element x to the back of the queue. Returns null.
- `["pop"]` - Remove the element from the front of the queue and return it.
- `["peek"]` - Return the element at the front of the queue without removing it.
- `["empty"]` - Return true if the queue is empty, false otherwise.
Return an array of results for each command.