#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define pb push_back
#define sz(x) (int)(x.size())
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
#define vi vector<int>
#define vp vector<pii>
#define vvi vector<vi>
#define ykh mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count())
#define __lg(x) 63-__builtin_clzll(x)
#define pow2(x) (1LL<<x)
void __print(int x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifdef local
void CHECK();
void setio(){
freopen("/Users/iantsai/cpp/input.txt","r",stdin);
freopen("/Users/iantsai/cpp/output.txt","w",stdout);
}
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
void setio(){}
#define debug(x...)
#endif
#define TOI_is_so_de ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);setio();
const int mxn = 6e5 + 5;
vector<array<int,3>>adj[mxn], adj2[mxn];
vector<int>g[mxn], rg[mxn];
vector<array<int, 4>>op;
vector<int>fix(mxn), ord;
int scc[mxn], cnt = 0;
bool vis[mxn];
void rdfs(int v){
vis[v] = 1;
for(auto u : rg[v]){
if(vis[u]) continue;
rdfs(u);
}
ord.pb(v);
cout << v << '\n';
}
void dfs(int v, int c){
scc[v] = c;
for(auto u : g[v]){
if(scc[u]) continue;
dfs(u, c);
}
}
void init(int n){
ord.clear();
cnt = 0;
op.clear();
for(int i = 1; i <= 2 * n; i++){
scc[i] = 0;
rg[i].clear();
g[i].clear();
fix[i] = 0;
adj[i].clear();
adj2[i].clear();
vis[i] = 0;
}
}
void solve(){
int n, m;
n = 1;
g[1].pb(2);
rg[2].pb(1);
for(int i = 1; i <= 2 * n; i++){
if(!vis[i]) rdfs(i);
}
reverse(all(ord));
for(auto v : ord){
if(!scc[v]){
++cnt;
dfs(v, cnt);
}
cout << v << ',' << scc[v] << ' ';
}
}
signed main(){
TOI_is_so_de;
int t = 1;
cin >> t;
while(t--){
solve();
}
#ifdef local
CHECK();
#endif
}
/*
input:
*/
#ifdef local
void CHECK(){
cerr << "\n[Time]: " << 1000.0 * clock() / CLOCKS_PER_SEC << " ms.\n";
function<bool(string,string)> compareFiles = [](string p1, string p2)->bool {
std::ifstream file1(p1);
std::ifstream file2(p2);
if(!file1.is_open() || !file2.is_open()) return false;
std::string line1, line2;
while (getline(file1, line1) && getline(file2, line2)) {
if (line1 != line2)return false;
}
int cnta = 0, cntb = 0;
while(getline(file1,line1))cnta++;
while(getline(file2,line2))cntb++;
return cntb - cnta <= 1;
};
bool check = compareFiles("output.txt","expected.txt");
if(check) cerr<<"ACCEPTED\n";
else cerr<<"WRONG ANSWER!\n";
}
#else
#endif
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgRiBmaXJzdAojZGVmaW5lIFMgc2Vjb25kCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSx4LmVuZCgpCiNkZWZpbmUgcGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBzeih4KSAoaW50KSh4LnNpemUoKSkKI2RlZmluZSBjaG1pbih4LHkpIHg9bWluKHgseSkKI2RlZmluZSBjaG1heCh4LHkpIHg9bWF4KHgseSkKI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZwIHZlY3RvcjxwaWk+CiNkZWZpbmUgdnZpIHZlY3Rvcjx2aT4KI2RlZmluZSB5a2ggbXQxOTkzN182NCBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKQojZGVmaW5lIF9fbGcoeCkgNjMtX19idWlsdGluX2NsemxsKHgpCiNkZWZpbmUgcG93Mih4KSAoMUxMPDx4KQp2b2lkIF9fcHJpbnQoaW50IHgpIHtjZXJyIDw8IHg7fQp2b2lkIF9fcHJpbnQoZmxvYXQgeCkge2NlcnIgPDwgeDt9CnZvaWQgX19wcmludChkb3VibGUgeCkge2NlcnIgPDwgeDt9CnZvaWQgX19wcmludChsb25nIGRvdWJsZSB4KSB7Y2VyciA8PCB4O30Kdm9pZCBfX3ByaW50KGNoYXIgeCkge2NlcnIgPDwgJ1wnJyA8PCB4IDw8ICdcJyc7fQp2b2lkIF9fcHJpbnQoY29uc3QgY2hhciAqeCkge2NlcnIgPDwgJ1wiJyA8PCB4IDw8ICdcIic7fQp2b2lkIF9fcHJpbnQoY29uc3Qgc3RyaW5nICZ4KSB7Y2VyciA8PCAnXCInIDw8IHggPDwgJ1wiJzt9CnZvaWQgX19wcmludChib29sIHgpIHtjZXJyIDw8ICh4ID8gInRydWUiIDogImZhbHNlIik7fQoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVj4Kdm9pZCBfX3ByaW50KGNvbnN0IHBhaXI8VCwgVj4gJngpIHtjZXJyIDw8ICd7JzsgX19wcmludCh4LmZpcnN0KTsgY2VyciA8PCAnLCc7IF9fcHJpbnQoeC5zZWNvbmQpOyBjZXJyIDw8ICd9Jzt9CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgX19wcmludChjb25zdCBUICZ4KSB7aW50IGYgPSAwOyBjZXJyIDw8ICd7JzsgZm9yIChhdXRvICZpOiB4KSBjZXJyIDw8IChmKysgPyAiLCIgOiAiIiksIF9fcHJpbnQoaSk7IGNlcnIgPDwgIn0iO30Kdm9pZCBfcHJpbnQoKSB7Y2VyciA8PCAiXVxuIjt9CnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBWPgp2b2lkIF9wcmludChUIHQsIFYuLi4gdikge19fcHJpbnQodCk7IGlmIChzaXplb2YuLi4odikpIGNlcnIgPDwgIiwgIjsgX3ByaW50KHYuLi4pO30KI2lmZGVmIGxvY2FsCnZvaWQgQ0hFQ0soKTsKdm9pZCBzZXRpbygpewogICAgZnJlb3BlbigiL1VzZXJzL2lhbnRzYWkvY3BwL2lucHV0LnR4dCIsInIiLHN0ZGluKTsKICAgIGZyZW9wZW4oIi9Vc2Vycy9pYW50c2FpL2NwcC9vdXRwdXQudHh0IiwidyIsc3Rkb3V0KTsKfQojZGVmaW5lIGRlYnVnKHguLi4pIGNlcnIgPDwgIlsiIDw8ICN4IDw8ICJdID0gWyI7IF9wcmludCh4KQojZWxzZQp2b2lkIHNldGlvKCl7fQojZGVmaW5lIGRlYnVnKHguLi4pCiNlbmRpZgojZGVmaW5lIFRPSV9pc19zb19kZSBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApO3NldGlvKCk7CmNvbnN0IGludCBteG4gPSA2ZTUgKyA1Owp2ZWN0b3I8YXJyYXk8aW50LDM+PmFkaltteG5dLCBhZGoyW214bl07CnZlY3RvcjxpbnQ+Z1tteG5dLCByZ1tteG5dOwp2ZWN0b3I8YXJyYXk8aW50LCA0Pj5vcDsKdmVjdG9yPGludD5maXgobXhuKSwgb3JkOwppbnQgc2NjW214bl0sIGNudCA9IDA7CmJvb2wgdmlzW214bl07CnZvaWQgcmRmcyhpbnQgdil7CiAgICB2aXNbdl0gPSAxOwogICAgZm9yKGF1dG8gdSA6IHJnW3ZdKXsKICAgICAgICBpZih2aXNbdV0pIGNvbnRpbnVlOwogICAgICAgIHJkZnModSk7CiAgICB9CiAgICBvcmQucGIodik7CiAgICBjb3V0IDw8IHYgPDwgJ1xuJzsKfQp2b2lkIGRmcyhpbnQgdiwgaW50IGMpewogICAgc2NjW3ZdID0gYzsKICAgIGZvcihhdXRvIHUgOiBnW3ZdKXsKICAgICAgICBpZihzY2NbdV0pIGNvbnRpbnVlOwogICAgICAgIGRmcyh1LCBjKTsKICAgIH0KfQp2b2lkIGluaXQoaW50IG4pewogICAgb3JkLmNsZWFyKCk7CiAgICBjbnQgPSAwOwogICAgb3AuY2xlYXIoKTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gMiAqIG47IGkrKyl7CiAgICAgICAgc2NjW2ldID0gMDsKICAgICAgICByZ1tpXS5jbGVhcigpOwogICAgICAgIGdbaV0uY2xlYXIoKTsKICAgICAgICBmaXhbaV0gPSAwOwogICAgICAgIGFkaltpXS5jbGVhcigpOwogICAgICAgIGFkajJbaV0uY2xlYXIoKTsKICAgICAgICB2aXNbaV0gPSAwOwogICAgfQp9CnZvaWQgc29sdmUoKXsKICAgIGludCBuLCBtOwogICAgbiA9IDE7CiAgICBnWzFdLnBiKDIpOwogICAgcmdbMl0ucGIoMSk7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IDIgKiBuOyBpKyspewogICAgICAgIGlmKCF2aXNbaV0pIHJkZnMoaSk7CiAgICB9CiAgICByZXZlcnNlKGFsbChvcmQpKTsKICAgIGZvcihhdXRvIHYgOiBvcmQpewogICAgICAgIGlmKCFzY2Nbdl0pewogICAgICAgICAgICArK2NudDsKICAgICAgICAgICAgZGZzKHYsIGNudCk7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgdiA8PCAnLCcgPDwgc2NjW3ZdIDw8ICcgJzsgCiAgICB9Cn0Kc2lnbmVkIG1haW4oKXsKICAgIFRPSV9pc19zb19kZTsKICAgIGludCB0ID0gMTsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUodC0tKXsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgI2lmZGVmIGxvY2FsCiAgICBDSEVDSygpOwogICAgI2VuZGlmCn0KLyoKaW5wdXQ6CiAKKi8KI2lmZGVmIGxvY2FsCnZvaWQgQ0hFQ0soKXsKICAgIGNlcnIgPDwgIlxuW1RpbWVdOiAiIDw8IDEwMDAuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQyA8PCAiIG1zLlxuIjsKICAgIGZ1bmN0aW9uPGJvb2woc3RyaW5nLHN0cmluZyk+IGNvbXBhcmVGaWxlcyA9IFtdKHN0cmluZyBwMSwgc3RyaW5nIHAyKS0+Ym9vbCB7CiAgICAgICAgc3RkOjppZnN0cmVhbSBmaWxlMShwMSk7CiAgICAgICAgc3RkOjppZnN0cmVhbSBmaWxlMihwMik7CiAgICAgICAgaWYoIWZpbGUxLmlzX29wZW4oKSB8fCAhZmlsZTIuaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgc3RkOjpzdHJpbmcgbGluZTEsIGxpbmUyOwogICAgICAgIHdoaWxlIChnZXRsaW5lKGZpbGUxLCBsaW5lMSkgJiYgZ2V0bGluZShmaWxlMiwgbGluZTIpKSB7CiAgICAgICAgICAgIGlmIChsaW5lMSAhPSBsaW5lMilyZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGludCBjbnRhID0gMCwgY250YiA9IDA7CiAgICAgICAgd2hpbGUoZ2V0bGluZShmaWxlMSxsaW5lMSkpY250YSsrOwogICAgICAgIHdoaWxlKGdldGxpbmUoZmlsZTIsbGluZTIpKWNudGIrKzsKICAgICAgICByZXR1cm4gY250YiAtIGNudGEgPD0gMTsKICAgIH07CiAgICBib29sIGNoZWNrID0gY29tcGFyZUZpbGVzKCJvdXRwdXQudHh0IiwiZXhwZWN0ZWQudHh0Iik7CiAgICBpZihjaGVjaykgY2Vycjw8IkFDQ0VQVEVEXG4iOwogICAgZWxzZSBjZXJyPDwiV1JPTkcgQU5TV0VSIVxuIjsKfQojZWxzZQojZW5kaWYKCgoK