#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10,M=2e6+10;
int h[N],e[M],hs[N],ne[M],idx;
int dfn[N],low[N];
int stk[N],ins[N],c[N];
vector<int>scc[N];
int n,m,tot,num,top,cnt,mod;
unordered_set<int>S;
int f[N],g[N];
void add(int h[],int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int x)
{
dfn[x]=low[x]=++num;
stk[++top]=x,ins[x]=1;
for(int i=h[x];~i;i=ne[i])
{
int j=e[i];
if(!dfn[j])
{
tarjan(j);
low[x]=min(low[x],low[j]);
}
else if(ins[j])
{
low[x]=min(low[x],dfn[j]);
}
}
if(dfn[x]==low[x]){
cnt++;
int y;
do{
y=stk[top--],ins[y]=0;
c[y]=cnt,scc[cnt].push_back(y);
}while(x!=y);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m>>mod;
memset(h,-1,sizeof h);
memset(hs,-1,sizeof hs);
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
add(h,a,b);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])tarjan(i);
}
unordered_set<LL> S; // (u, v) -> u * 1000000 + v
for (int i = 1; i <= n; i ++ )
for (int j = h[i]; ~j; j = ne[j])
{
int k = e[j];
int a = c[i], b = c[k];
LL hash = a * 1000000ll + b;
if (a != b && !S.count(hash))
{
add(hs, a, b);
S.insert(hash);
}
}
for (int i = cnt; i; i -- )
{
if (!f[i])
{
f[i] = scc[i].size();
g[i] = 1;
}
for (int j = hs[i]; ~j; j = ne[j])
{
int k = e[j];
if (f[k] < f[i] + scc[k].size())
{
f[k] = f[i] + scc[k].size();
g[k] = g[i];
}
else if (f[k] == f[i] + scc[k].size())
g[k] = (g[k] + g[i]) % mod;
}
}
int maxf = 0, sum = 0;
for (int i = 1; i <= cnt; i ++ )
if (f[i] > maxf)
{
maxf = f[i];
sum = g[i];
}
else if (f[i] == maxf) sum = (sum + g[i]) % mod;
cout<<maxf<<endl<<sum<<endl;
return 0;
}