//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
//#include<stack>
#include<set>
#include<map>
using namespace std;
//Macro
#define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
#define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
#define erep(i,e,x) for(int i=x;i;i=e[i].next)
#define irep(i,x) for(set<int>::iterator i=x.begin();i!=x.end();i++)
#define read() (strtol(ipos,&ipos,10))
#define sqr(x) ((x)*(x))
#define pb push_back
#define PS system("pause");
typedef long long ll;
typedef pair<int,int> pii;
const int oo=~0U>>1;
const double inf=1e100;
const double eps=1e-6;
string name="", in=".in", out=".out";
//Var
struct S
{
int size,sum;
S():size(0),sum(1){}
}f[100008],ans;
struct E
{
int next,node;
}e[1000008];
int n,m,mod,tot;
int stack[100008],dfn[100008],low[100008],top,idx,cnt;
int belong[100008],ind[100008],size[100008],h[100008];
bool vis[100008];
set<int> E[100008];
queue<int> q;
vector<int> vec;
void add(int a,int b){e[++tot].next=h[a];e[tot].node=b;h[a]=tot;}
void Update(S &a,S &b)
{
if(a.size>b.size)return;
if(a.size<b.size){a=b;return;}
a.sum=(a.sum+b.sum)%mod;
}
void DFS(int u)
{
dfn[u]=low[u]=++idx;
stack[++top]=u;vis[u]=true;
int v;
erep(i,e,h[u])
{
if(!dfn[v=e[i].node])
{
DFS(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
++cnt;
do
{
belong[v=stack[top--]]=cnt;
vis[v]=false;
}while(u!=v);
}
}
void Tarjan()
{
rep(i,1,n)if(!dfn[i])DFS(i);
rep(i,1,n)
{
int id=belong[i];size[id]++;
erep(x,e,h[i])if(belong[e[x].node]!=id)E[id].insert(belong[e[x].node]);
}
}
void Work()
{
int u,v;
scanf("%d%d%d",&n,&m,&mod);
rep(i,1,m)scanf("%d%d",&u,&v),add(u,v);
Tarjan();
rep(i,1,cnt)
irep(it,E[i])
ind[*it]++;
rep(i,1,cnt)if(!ind[i])q.push(i);
while(!q.empty())
{
u=q.front();q.pop();vec.pb(u);
irep(i,E[u])
if(!(--ind[*i]))
q.push(*i);
}
for(vector<int>::reverse_iterator i=vec.rbegin();i!=vec.rend();i++)
{
irep(it,E[*i])
Update(f[*i],f[*it]);
f[*i].size=(f[*i].size+size[*i])%mod;
}
rep(i,1,cnt)Update(ans,f[i]);
printf("%d\n%d\n",ans.size,ans.sum);
}
int main()
{
// freopen((name+in).c_str(),"r",stdin);
// freopen((name+out).c_str(),"w",stdout);
// Init();
Work();
return 0;
}
Ly9MaWIKI2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxjc3RkbGliPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8Y3RpbWU+CiAKI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxzdHJpbmc+CiNpbmNsdWRlPHF1ZXVlPgovLyNpbmNsdWRlPHN0YWNrPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPG1hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy9NYWNybwojZGVmaW5lIHJlcChpLGEsYikgIGZvcihpbnQgaT1hLHR0PWI7aTw9dHQ7KytpKQojZGVmaW5lIGRyZXAoaSxhLGIpIGZvcihpbnQgaT1hLHR0PWI7aT49dHQ7LS1pKQojZGVmaW5lIGVyZXAoaSxlLHgpIGZvcihpbnQgaT14O2k7aT1lW2ldLm5leHQpCiNkZWZpbmUgaXJlcChpLHgpICAgZm9yKHNldDxpbnQ+OjppdGVyYXRvciBpPXguYmVnaW4oKTtpIT14LmVuZCgpO2krKykKI2RlZmluZSByZWFkKCkgIChzdHJ0b2woaXBvcywmaXBvcywxMCkpCiNkZWZpbmUgc3FyKHgpICAoKHgpKih4KSkKI2RlZmluZSBwYiAgcHVzaF9iYWNrCiNkZWZpbmUgUFMgIHN5c3RlbSgicGF1c2UiKTsKdHlwZWRlZiBsb25nIGxvbmcgICBsbDsKdHlwZWRlZiBwYWlyPGludCxpbnQ+IHBpaTsKY29uc3QgaW50IG9vPX4wVT4+MTsKY29uc3QgZG91YmxlIGluZj0xZTEwMDsKY29uc3QgZG91YmxlIGVwcz0xZS02OwpzdHJpbmcgbmFtZT0iIiwgaW49Ii5pbiIsIG91dD0iLm91dCI7Ci8vVmFyCnN0cnVjdCBTCnsKICAgIGludCBzaXplLHN1bTsKICAgIFMoKTpzaXplKDApLHN1bSgxKXt9Cn1mWzEwMDAwOF0sYW5zOwpzdHJ1Y3QgRQp7CiAgICBpbnQgbmV4dCxub2RlOwp9ZVsxMDAwMDA4XTsKaW50IG4sbSxtb2QsdG90OwppbnQgc3RhY2tbMTAwMDA4XSxkZm5bMTAwMDA4XSxsb3dbMTAwMDA4XSx0b3AsaWR4LGNudDsKaW50IGJlbG9uZ1sxMDAwMDhdLGluZFsxMDAwMDhdLHNpemVbMTAwMDA4XSxoWzEwMDAwOF07CmJvb2wgdmlzWzEwMDAwOF07CnNldDxpbnQ+IEVbMTAwMDA4XTsKcXVldWU8aW50PiBxOwp2ZWN0b3I8aW50PiB2ZWM7CnZvaWQgYWRkKGludCBhLGludCBiKXtlWysrdG90XS5uZXh0PWhbYV07ZVt0b3RdLm5vZGU9YjtoW2FdPXRvdDt9CnZvaWQgVXBkYXRlKFMgJmEsUyAmYikKewogICAgaWYoYS5zaXplPmIuc2l6ZSlyZXR1cm47CiAgICBpZihhLnNpemU8Yi5zaXplKXthPWI7cmV0dXJuO30KICAgIGEuc3VtPShhLnN1bStiLnN1bSklbW9kOwp9CnZvaWQgREZTKGludCB1KQp7CiAgICBkZm5bdV09bG93W3VdPSsraWR4OwogICAgc3RhY2tbKyt0b3BdPXU7dmlzW3VdPXRydWU7CiAgICBpbnQgdjsKICAgIGVyZXAoaSxlLGhbdV0pCiAgICB7CiAgICAgICAgaWYoIWRmblt2PWVbaV0ubm9kZV0pCiAgICAgICAgewogICAgICAgICAgICBERlModik7CiAgICAgICAgICAgIGxvd1t1XT1taW4obG93W3VdLGxvd1t2XSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYodmlzW3ZdKSBsb3dbdV09bWluKGxvd1t1XSxkZm5bdl0pOwogICAgfQogICAgaWYobG93W3VdPT1kZm5bdV0pCiAgICB7CiAgICAgICAgKytjbnQ7CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAgIGJlbG9uZ1t2PXN0YWNrW3RvcC0tXV09Y250OwogICAgICAgICAgICB2aXNbdl09ZmFsc2U7CiAgICAgICAgfXdoaWxlKHUhPXYpOwogICAgfQp9CnZvaWQgVGFyamFuKCkKewogICAgcmVwKGksMSxuKWlmKCFkZm5baV0pREZTKGkpOwogICAgcmVwKGksMSxuKQogICAgewogICAgICAgIGludCBpZD1iZWxvbmdbaV07c2l6ZVtpZF0rKzsKICAgICAgICBlcmVwKHgsZSxoW2ldKWlmKGJlbG9uZ1tlW3hdLm5vZGVdIT1pZClFW2lkXS5pbnNlcnQoYmVsb25nW2VbeF0ubm9kZV0pOwogICAgfQp9CnZvaWQgV29yaygpCnsKICAgIGludCB1LHY7CiAgICBzY2FuZigiJWQlZCVkIiwmbiwmbSwmbW9kKTsKICAgIHJlcChpLDEsbSlzY2FuZigiJWQlZCIsJnUsJnYpLGFkZCh1LHYpOwogICAgVGFyamFuKCk7CiAgICByZXAoaSwxLGNudCkKICAgICAgICBpcmVwKGl0LEVbaV0pCiAgICAgICAgICAgIGluZFsqaXRdKys7CiAgICByZXAoaSwxLGNudClpZighaW5kW2ldKXEucHVzaChpKTsKICAgIHdoaWxlKCFxLmVtcHR5KCkpCiAgICB7CiAgICAgICAgdT1xLmZyb250KCk7cS5wb3AoKTt2ZWMucGIodSk7CiAgICAgICAgaXJlcChpLEVbdV0pCiAgICAgICAgICAgIGlmKCEoLS1pbmRbKmldKSkKICAgICAgICAgICAgICAgIHEucHVzaCgqaSk7CiAgICB9CiAgICBmb3IodmVjdG9yPGludD46OnJldmVyc2VfaXRlcmF0b3IgaT12ZWMucmJlZ2luKCk7aSE9dmVjLnJlbmQoKTtpKyspCiAgICB7CiAgICAgICAgaXJlcChpdCxFWyppXSkKICAgICAgICAgICAgVXBkYXRlKGZbKmldLGZbKml0XSk7CiAgICAgICAgZlsqaV0uc2l6ZT0oZlsqaV0uc2l6ZStzaXplWyppXSklbW9kOwogICAgfQogICAgcmVwKGksMSxjbnQpVXBkYXRlKGFucyxmW2ldKTsKICAgIHByaW50ZigiJWRcbiVkXG4iLGFucy5zaXplLGFucy5zdW0pOwp9CmludCBtYWluKCkKewovLyAgZnJlb3BlbigobmFtZStpbikuY19zdHIoKSwiciIsc3RkaW4pOwovLyAgZnJlb3BlbigobmFtZStvdXQpLmNfc3RyKCksInciLHN0ZG91dCk7Ci8vICBJbml0KCk7CiAgICBXb3JrKCk7CiAgICByZXR1cm4gMDsKfQ==