Wa on # 13
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,cnt,tmp,tog,tot,h[100005],in[100005],dfn[100005],low[100005],sig[100005],val[100005];
bool f;
stack<int>S;
struct node{
int u,v,nxt;
}e[300005];
string _;
vector<int>G[100005];
unordered_map<string,bool>M;
void adde(int u,int v){
e[++cnt].nxt=h[u];
h[u]=cnt;
e[cnt].v=v;
e[cnt].u=u;
}
void dfs(int x){
if(dfn[x])return;
dfn[x]=low[x]=++tot;
S.push(x);
for(int i=h[x];i;i=e[i].nxt){
if(!dfn[e[i].v])dfs(e[i].v),low[x]=min(low[x],low[e[i].v]);
else if(!sig[e[i].v])low[x]=min(low[x],dfn[e[i].v]);
}
if(low[x]==dfn[x]){
tog++;
while(1){
tmp=S.top();
S.pop();
sig[tmp]=tog;
val[tog]++;
if(tmp==x)break;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=m;i++)scanf("%d%d",&u,&v),adde(u,v);
for(int i=1;i<=n;i++)dfs(i);
for(int i=1;i<=m;i++){
if(sig[e[i].u]!=sig[e[i].v]){
_=to_string(sig[e[i].u])+' '+to_string(sig[e[i].v]);
if(!M.count(_)){
M[_]=1;
G[sig[e[i].u]].push_back(sig[e[i].v]);
in[sig[e[i].v]]++;
}
}
}
for(int i=1;i<=tog;i++){
if(!in[i]){
if(!f){
if(val[tog]==1){
for(auto v:G[tog]){
if(in[v]<2){
f=1;
break;
}
}
f=!f;
if(f)continue;
}
}
ans++;
}
}
printf("%.6lf",double(n-ans)/double(n));
return 0;
}
kkk= is sb