#include <cstdio>
#include <algorithm>
using namespace std;

struct line{
    int L;
    int R;
}a[100001];

bool cmp(line a,line b){
    if(a.L == b.L) return a.R < b.R;
    return a.L < b.L;
}
int main()
{
    int T,M;
    scanf("%d",&T);
    while (T--){
        scanf("%d",&M);
        int i,j,n=0;
        while (scanf("%d%d", &a[n].L,&a[n].R)){
            if (!a[n].L && !a[n].R) break;
            n++;
        }
        sort(a,a+n,cmp);

        int ans=0,left=0,right=0,Max=0,Max_index; //left是存a_index,right是存max
        int List[100001],l_index=0;
        bool Ans=1;

        while (Max<M){   //不斷靠近M
            right=Max;
            for(i=left;a[i].L<=right && i<n;i++){ /*a[i].L不能>right,不然範圍會沒有覆蓋*/
                if (Max<a[i].R){   //在沒有超過範圍的情況下,不斷找最靠近右邊的R
                    Max=a[i].R;
                    Max_index=i;
                }
            }
            if (Max==right) {Ans=0; break;}  //找不到的情況
            List[l_index++]=Max_index;       //將找到的點放入List
            ans++;
            left = i;
        }

        if(Ans){
            printf("%d\n",ans);
            for(i=0;i<l_index;i++)
                printf("%d %d\n",a[List[i]].L,a[List[i]].R);
        }
        else printf("0\n");

        if(T) printf("\n");

    }
    return 0;
}