import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine().trim());
// tc 수행
for (int tc = 1; tc <= T; tc++) {
// 학생의 수 N, 순서의 개수 M 입력
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// 차입 배열 초기화
int inDegree[] = new int[N + 1];
// 인접 리스트 초기화
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i <= N; i++) {
graph.add(new ArrayList<>());
}
// 간선 입력
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
graph.get(a).add(b);
inDegree[b]++;
}
Deque<Integer> q = new ArrayDeque<>();
StringBuilder result = new StringBuilder();
// 진입 차수가 0이면 큐에 먼저 삽입한다.
for (int i = 1; i <= N; i++) {
if (inDegree[i] == 0) {
q.offer(i);
}
}
// 더 이상 반복할 곳이 없을 때까지 반복
while (!q.isEmpty()) {
int cur = q.poll();
result.append(cur).append(" ");
for (int next : graph.get(cur)) {
inDegree[next]--;
if (inDegree[next] == 0) {
q.offer(next);
}
}
}
// 출력 내용 추가
sb.append("#" + tc + " " + result + "\n");
} // tc 종료
// 출력
System.out.println(sb);
}
}