#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
vector<int>edge[N];
int a[N],b[N];
vector<pair<int,int> >vec;
int dfn[N],low[N],id,stk[N],top,ins[N];
int sz[N],fa[N],cnt;
int in[N],f[N],g[N];
void tarjan(int u)
{
dfn[u]=low[u]=++id;
stk[++top]=u,ins[u]=1;
for(auto &v:edge[u])
{
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(ins[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
++cnt;
while(1)
{
int v=stk[top--];
ins[v]=0;
fa[v]=cnt;
++sz[cnt];
if(u==v)
break;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,mod;
cin>>n>>m>>mod;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
a[i]=u,b[i]=v;
edge[u].emplace_back(v);
}
for(int i=1;i<=n;++i)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;++i)
edge[i].clear();
for(int i=1;i<=m;++i)
if(fa[a[i]]!=fa[b[i]])vec.emplace_back(fa[a[i]],fa[b[i]]);
sort(vec.begin(),vec.end());
int tot=unique(vec.begin(),vec.end())-vec.begin();
for(int i=0;i<tot;++i)
{
int u=vec[i].first,v=vec[i].second;
edge[u].emplace_back(v);
++in[v];
}
queue<int>q;
for(int i=1;i<=cnt;++i)
{
if(!in[i])
{
f[i]=sz[i];
g[i]=1%mod;
q.emplace(i);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(auto &v:edge[u])
{
if(f[u]+sz[v]>f[v])
{
f[v]=f[u]+sz[v];
g[v]=g[u]%mod;
}
else if(f[u]+sz[v]==f[v])
(g[v]+=g[u])%mod;
if(!--in[v])
q.emplace(v);
}
}
int ans=0,sum=0;
for(int i=1;i<=cnt;++i)
{
if(f[i]>ans)
{
ans=f[i];
sum=g[i]%mod;
}
else if(f[i]==ans)
sum=(sum+g[i])%mod;
}
cout<<ans<<'\n'<<sum%mod;
}