import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @描述:合并两个有序的单链表
 * @思路: 1. 确定头节点
 * 2. 合并
 * 2.1 声明每次比较两个链表需要用到各自其上的一个节点;
 * 2.2 声明链接时,pre:上次比较的结果节点 next:下次比较需要的节点
 * 2.3 按比较后,指针是否在当前链表继续移动,分为两种情况;
 * 2.4 两条链表比较完毕后,将其余没参与比较的节点关联到结果链表中。
 * @复杂度:时间O(M+N)【M、N分别是两个链表的长度】, 空间(1)
 * @链接:https://www.nowcoder.com/questionTerminal/98a51a92836e4861be1803aaa9037440?answerType=1&f=discussion
 */
class MergeList {

    public static Node merge(Node head1, Node head2) {
        // -- 校验
        if (head1 == null || head2 == null) {
            return head1 == null ? head2 : head1;
        }
        // -- 确定头节点
        Node head = head1.getValue() < head2.getValue() ? head1 : head2;

        // -- 合并
        //cur1、cur2为每次比较遍历到的两个节点
        Node cur1 = head == head1 ? head1 : head2;   //一条链表的节点
        Node cur2 = head == head1 ? head2 : head1; //另一条链表的节点
        Node pre = null;  //上次比较较小的节点
        Node next = null;

        while (cur1 != null && cur2 != null) {
            if (cur1.getValue() <= cur2.getValue()) { // 比较后,指针在当前链表继续移动即可
                pre = cur1;
                cur1 = cur1.getNext();
            } else { //比较后,指针需要关联另一条链表中的节点
                next = cur2.getNext();

                //关联另一条链表中的节点
                pre.setNext(cur2);
                cur2.setNext(cur1);

                pre = cur2;
                cur2 = next;
            }
        }
        //直到将一条链表完全遍历完,结束循环后;将另一条上的节点关联到最终的结果链表中。
        Node lastNode = cur1 == null ? cur2 : cur1;
        pre.setNext(lastNode);

        return head;
    }


    public static void main(String[] args) {
        Integer[] arr1 = {1, 3, 4, 5, 6};
        Integer[] arr2 = {1, 2, 4, 7, 8};
        Node head1 = Node.createNodeList(arr1);
        Node head2 = Node.createNodeList(arr2);
        Node head = MergeList.merge(head1, head2);
        Node.printNodeList(head);
    }


}


public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String n = input.readLine();
        String[] strings1 = input.readLine().split(" ");
        Node head1 = Node.createNodeList(strings1);
        String m = input.readLine();
        String[] strings2 = input.readLine().split(" ");
        Node head2 = Node.createNodeList(strings2);
        Node head = MergeList.merge(head1, head2);
        Node.printNodeList(head);
    }
}


class Node {

    private Node next;

    private int value;

    public Node(int value) {
        this.value = value;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }


    public static Node createNodeList(Integer[] values) {
        Node head = new Node((values[0]));
        Node node = head;
        for (int i = 1; i < values.length; i++) {
            Node newNode = new Node(values[i]);
            node.next = newNode;
            node = newNode;
        }
        return head;
    }

    public static Node createNodeList(String[] values) {
        Node head = new Node(Integer.parseInt(values[0]));
        Node node = head;
        for (int i = 1; i < values.length; i++) {
            Node newNode = new Node(Integer.parseInt(values[i]));
            node.next = newNode;
            node = newNode;
        }
        return head;
    }


    public static void printNodeList(Node head) {
        StringBuilder sb = new StringBuilder();
        while (head != null) {
            sb.append(head.getValue()).append(" ");
            head = head.getNext();
        }
        System.out.println(sb.toString());
    }


}