#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef unsigned long long ll;//你开longlong了吗?
int n;
int a[1000005],opt[1000005];
vector<int> link[1000005];
int vis[1000005];
int num,tru,siz,flag=1,maxn;
ll mod=998244353;
ll ans=2;
void muti(int x)
{
x-=1;
while(x){
ans*=ans;
ans%=mod;
if(x%2==1){
ans*=2;
ans%=mod;
}
x/=2;
}
}
void dfs(int x,int tf)
{
if(flag==0){
return;
}
if(tf==0){
tru++;
}
siz++;
for(int i=0;i<link[x].size();i++){
if(link[x][i]<0){
if((vis[link[x][i]*-1]<0&&tf==0)||(vis[link[x][i]*-1]>0&&tf==1)){
flag=0;
return;
}
if(vis[link[x][i]*-1]==0){
if(tf==0){
vis[link[x][i]]=-1;
}else{
vis[link[x][i]]=1;
}
dfs(link[x][i]*-1,!tf);
}
}else{
if((vis[link[x][i]*-1]<0&&tf==1)||(vis[link[x][i]*-1]>0&&tf==0)){
flag=0;
return;
}
if(vis[link[x][i]]==0){
if(tf==0){
vis[link[x][i]]=1;
}else{
vis[link[x][i]]=-1;
}
dfs(link[x][i],tf);
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>opt[i];
if(opt[i]==1){
link[i].push_back(a[i]);
link[a[i]].push_back(i);
}else{
link[i].push_back(-1*a[i]);
link[a[i]].push_back(-1*i);
}
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
siz=0;
tru=0;
num++;
dfs(i,0);
if(flag==0){
cout<<"No answer";
return 0;
}else{
maxn+=max(siz-tru,tru);
}
}
}
muti(num);
cout<<ans<<endl;
cout<<max(maxn,n-maxn)<<endl;
cout<<min(maxn,n-maxn);
return 0;
}