/*
以前做过一个插队的题,这个类似从后往前操作
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#define N 600000
using namespace std;
struct node
{
int x,y,z;
//每一个操作,z表示这个操作是不是有效的
node(){}
node(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
};
vector<node>v;
vector<int>w;
int t,n,m;
int x,y,z;
int done[N];//表示当前数字操作过没有
int a[N];//表示那些人被添加进来了
void init()
{
memset(a,,sizeof a);
v.clear();
v.push_back(node(,,));
w.clear();
memset(done,,sizeof done);
}
int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
scanf("%d",&t);
//cout<<t<<endl;
while(t--)
{
init();
scanf("%d%d",&n,&m);
//cout<<n<<" "<<m<<endl;
for(int i=;i<m;i++)
{
scanf("%d%d",&x,&y);
v.push_back(node(x,y,));
}
for(int i=v.size()-;i>=;i--)
{
if(v[i].z)//这个操作可以做
{
if(v[i].x==)
v[v[i].y].z=;
else if(v[i].x==)
{
if(done[v[i].y]==)
{
a[v[i].y]=;
done[v[i].y]=;
} }
else if(v[i].x==)
{
if(done[v[i].y]==)
{
a[v[i].y]=;
done[v[i].y]=;
}
}
}
}
for(int i=;i<=n;i++)
{
//cout<<a[i]<<" ";
if(a[i]==)
{
w.push_back(i);
//cout<<i<<" ";
}
}
//cout<<endl;
printf("%d\n",w.size());
for(int i=;i<w.size();i++)
printf("%d ",w[i]);
printf("\n");
}
return ;
}
/*
急需一个能写模拟的队友,在线等挺急的 莫名地RE了,所有能考虑的地方都考虑了
*/
/*
先不要进行操作,先将所有的操作跑一边看看哪些1,2操作是有效的,哪些是无效的
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#define N 600000
using namespace std;
struct node
{
int x,y,z;
//每一个操作,z表示这个操作是不是有效的
node(){}
node(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
};
vector<node>v;
vector<int>w;
int t,n,m;
int x,y,z;
int a[N];//表示那些人被添加进来了
void recall(int x)//x就是要撤销的x号操作
{
if(x<||x>v.size())
return;
//cout<<x<<endl;
if(v[x].x!=)//如果要撤销的是1,2号操作的话
{
v[x].z^=;//将这个操作撤销
//如果已经被撤销了的话就不用管了
return ;
}
else
{
v[x].z^=;//将这个操作撤销
recall(v[x].y);//继续递归下去撤销下一个操作
//如果已经被撤销了的话就不用管了
}
}
void init()
{
memset(a,,sizeof a);
v.clear();
v.push_back(node(,,));
w.clear();
}
int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
scanf("%d",&t);
//cout<<t<<endl;
while(t--)
{
init();
scanf("%d%d",&n,&m);
//cout<<n<<" "<<m<<endl;
for(int i=;i<m;i++)
{
scanf("%d%d",&x,&y);
//cout<<x<<" "<<y<<endl;
if(x==)
{
v.push_back(node(x,y,));
}
else if(x==)
{
v.push_back(node(x,y,));
}
else if(x==)
{
v.push_back(node(x,y,));
//cout<<"**********"<<endl;
recall(y);
// cout<<"**********"<<endl;
}
}
for(int i=;i<v.size();i++)
{
if(v[i].x!=)//只有1,2号操作可以
{
if(v[i].z)//这个操作有效的
{
//cout<<v[i].x<<" "<<v[i].y<<endl;
if(v[i].x==)
{
a[v[i].y]=;
}
else if(v[i].x==)
{
a[v[i].y]=;
}
}
}
}
for(int i=;i<=n;i++)
{
//cout<<a[i]<<" ";
if(a[i]==)
{
w.push_back(i);
//cout<<i<<" ";
}
}
//cout<<endl;
printf("%d\n",w.size());
for(int i=;i<w.size();i++)
printf("%d ",w[i]);
printf("\n");
}
return ;
}