牢记!并查集的合并是fa[father(u)]=father(v)不是fa[u]=father(v)
#include<bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
typedef long long ll;
const int N=400005;
ll n,m,k,x,y;
int a[N],fa[N];
map<int,int> mp;
vector<pr> ve[N];
int father(int x) {
if(fa[x]==x) return x;
return fa[x]=father(fa[x]);
}
void solve_m(int u) {
cin>>x;
if(mp.count(x)) {
int v=mp[x];
if(father(v)==father(u)) return ;
else {
fa[father(u)]=father(v);
ve[v].push_back(pr(u,x));
ve[u].push_back(pr(v,x));
}
} else mp[x]=u;
}
void dfs(int u,int fa) {
for(pr p:ve[u]) {
int v=p.fi;
if(v==fa) continue;
cout<<u<<' '<<v<<' '<<p.se<<'\n';
dfs(v,u);
}
}
void solve(int l=0,int r=0,int _i=1) {
mp.clear();
rep(i,n) fa[i]=i,ve[i].clear();
rep(i,n) {
cin>>m;
rep(j,m) solve_m(i);
}
rep(i,n) if(father(i)!=father(1)) {
cout<<"impossible\n";
return ;
} dfs(1,0);
}
int main() {
ios::sync_with_stdio(false);
while(cin>>n) solve();
}