找一个反图的拓扑序最大即可
贪心性显然
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define T 111111
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i*f;
}
int d[T],head[T],nxt[T],lst[T],ans[T],c[T],b[T],vis[T];
int n,m,S,tot,TI;
priority_queue<int,vector<int> >q;
void Pretreatment()
{
tot=0;
for(int i=1;i<=n;i++)
d[i]=head[i]=vis[i]=0;
}
void insert(int x,int y)
{
d[y]++;
lst[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
bool solve()
{
int now=n;
while(!q.empty())
{
int x=q.top(); q.pop(); b[now--]=x;
for(int i=head[x];i;i=nxt[i])
{
d[lst[i]]--;
if(!d[lst[i]]) q.push(lst[i]);
}
}
return now==0;
}
int main()
{
S=sc();
while(S--)
{
n=sc(),m=sc();
Pretreatment();
for(int i=1;i<=m;i++)
{
int x=sc(),y=sc();
insert(y,x);
}
for(int i=1;i<=n;i++)if(!d[i])q.push(i);
if(!solve()) puts("Impossible!");
else
{
for(int i=1;i<=n;i++)printf("%d ",b[i]);
puts("");
}
}
return 0;
}