模拟就过
#include <iostream>
#include <cstring>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <cstdio>
#include <stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
inline ll read()
{
ll k = 0, f = 1; char ch = getchar();
while (ch < '0' || ch>'9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
k = k * 10 + ch - '0';
ch = getchar();
}
return k * f;
}
priority_queue<ll,vector<ll>,greater<ll> >v[100005];
map<ll,ll>mp1;
map<ll,ll>mp2;
int main()
{
ll t=read();
while(t--)
{
ll n=read();
for(int i=1;i<=n;i++)
{
mp1[i]=0;
mp2[i]=0;
while(!v[i].empty())v[i].pop();
}
for(int i=1;i<=n;i++)
{
ll k=read();
for(int j=1;j<=k;j++)
{
ll temp1=read();
v[i].push(temp1);
}
}
for(int i=1;i<=n;i++)
{
while(!v[i].empty()&&mp2[v[i].top()]==1)
{
v[i].pop();
}
if(!v[i].empty())
{
mp2[v[i].top()]=1;
mp1[i]=1;
v[i].pop();
}
}
ll ans1=-1,ans2=-1;
for(int i=1;i<=n;i++)
{
if(!mp1[i])ans1=i;
if(!mp2[i])ans2=i;
if(ans1!=-1&&ans2!=-1)break;
}
if(ans1==-1||ans2==-1)
{
cout<<"OPTIMAL\n";
}
else
{
cout<<"IMPROVE\n";
cout<<ans1<<' '<<ans2<<'\n';
}
}
}