#include<stdio.h>
#include<list>
#include<vector>
#define MOD 1000000007
using namespace std;
int main()
{
int test,n,m,a,b;
scanf("%d",&test);
while(test--)
{
scanf("%d%d",&n,&m);
vector <list<int> > input(n);
list <int> qq;
list <int>::iterator it;
while(m--)
{
scanf("%d%d",&a,&b);
a--,b--;
input[a].push_back(b);
}
int visit[n],done[n];
for(int i=0;i<n;i++)
visit[i]=1,done[i]=0;
int count=0;
long long ans=1;
for(int i=0;i<n;i++)
{
if(visit[i])
{
count++;
int k=0;
qq.push_back(i);
visit[i]=0;
done[i]=1;
while(!qq.empty())
{
//for(it=qq.begin();it!=qq.end();it++) printf("%d ",*it);puts("");
k++;
int ff=qq.front();
qq.pop_front();
visit[ff]=0;
while(!input[ff].empty())
{
int temp=input[ff].front();
input[ff].pop_front();
if(done[temp]) continue;
qq.push_back(temp);
done[temp]=1;
}
}
ans*=(k);
ans%=MOD;
}
}
input.clear();
printf("%d %lld\n",count,ans);
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8bGlzdD4KI2luY2x1ZGU8dmVjdG9yPgojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBtYWluKCkKewoJaW50IHRlc3QsbixtLGEsYjsKCXNjYW5mKCIlZCIsJnRlc3QpOwoJd2hpbGUodGVzdC0tKQoJewoJCXNjYW5mKCIlZCVkIiwmbiwmbSk7CgkJdmVjdG9yIDxsaXN0PGludD4gPiBpbnB1dChuKTsKCQlsaXN0IDxpbnQ+IHFxOwoJCWxpc3QgPGludD46Oml0ZXJhdG9yIGl0OwoJCXdoaWxlKG0tLSkKCQl7CgkJCXNjYW5mKCIlZCVkIiwmYSwmYik7CgkJCWEtLSxiLS07CgkJCWlucHV0W2FdLnB1c2hfYmFjayhiKTsKCQl9CgkJaW50IHZpc2l0W25dLGRvbmVbbl07CgkJZm9yKGludCBpPTA7aTxuO2krKykKCQkJdmlzaXRbaV09MSxkb25lW2ldPTA7CgkJaW50IGNvdW50PTA7CgkJbG9uZyBsb25nIGFucz0xOwoJCWZvcihpbnQgaT0wO2k8bjtpKyspCgkJewoJCQlpZih2aXNpdFtpXSkKCQkJewoJCQkJY291bnQrKzsKCQkJCWludCBrPTA7CgkJCQlxcS5wdXNoX2JhY2soaSk7CgkJCQl2aXNpdFtpXT0wOwoJCQkJZG9uZVtpXT0xOwoJCQkJd2hpbGUoIXFxLmVtcHR5KCkpCgkJCQl7CgkJCQkJLy9mb3IoaXQ9cXEuYmVnaW4oKTtpdCE9cXEuZW5kKCk7aXQrKykgcHJpbnRmKCIlZCAiLCppdCk7cHV0cygiIik7CgkJCQkJaysrOwoJCQkJCWludCBmZj1xcS5mcm9udCgpOwoJCQkJCXFxLnBvcF9mcm9udCgpOwoJCQkJCXZpc2l0W2ZmXT0wOwoJCQkJCXdoaWxlKCFpbnB1dFtmZl0uZW1wdHkoKSkKCQkJCQl7CgkJCQkJCWludCB0ZW1wPWlucHV0W2ZmXS5mcm9udCgpOwoJCQkJCQlpbnB1dFtmZl0ucG9wX2Zyb250KCk7CgkJCQkJCWlmKGRvbmVbdGVtcF0pIGNvbnRpbnVlOwoJCQkJCQlxcS5wdXNoX2JhY2sodGVtcCk7CgkJCQkJCWRvbmVbdGVtcF09MTsKCQkJCQl9CgkJCQl9CgkJCQlhbnMqPShrKTsKCQkJCWFucyU9TU9EOwoJCQl9CgkJfQoJCWlucHV0LmNsZWFyKCk7CgkJcHJpbnRmKCIlZCAlbGxkXG4iLGNvdW50LGFucyk7Cgl9CglyZXR1cm4gMDsKfQ==