#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;


struct list{
	int u,v,w;
	int next;
}edge[110000];
int head[33000];
int tot; 

//反向建立边 
void add(int u,int v,int w){
	edge[tot].u=u;
	edge[tot].v=v;
	edge[tot].w=w;
	edge[tot].next=head[u];
	head[u]=tot++;
}

int du[33000];
void init(){   //初始化
	memset(head,-1,sizeof(head));
	tot=1;
	memset(du,0,sizeof(du));
}
priority_queue<int>que;
vector<int> vec;
int n;
void dos(){

	  
   vec.clear();
   while (!que.empty()) que.pop();
   for (int i=1;i<=n;i++)
     {
       if (du[i]==0) que.push(i);
    
	 }
	 while (!que.empty()){   
	 	int x=que.top();
	 	que.pop();
	 	for (int i=head[x];i!=-1;i=edge[i].next){
	 		int y=edge[i].v;
	 		du[y]--;
	 		if (du[y]==0)
	 		 que.push(y);
		 }
		 vec.push_back(x);
	 }
	 for (int i=n-1;i>=0;i--){
	 	if (i!=n-1) printf(" ");
	 	printf("%d",vec[i]);
	 }
	 cout<<endl; 
}
int main(){
	int t;
	scanf("%d",&t);
	while (t--){
       init();
	   int m;
       scanf("%d%d",&n,&m);
       for (int i=1;i<=m;i++)
       {
       	int a,b;
       	scanf("%d%d",&a,&b);
       	add(b,a,1);
       	du[a]++;
	   //printf("du[a]=%d\n",du[a]);
	   }
	 
	   dos();
	}
   return 0;
}