Problem:


Score : 400 points

Problem Statement

There are N persons called Person 1 through Person N.

You are given M facts that "Person A_i and Person B_i are friends." The same fact may be given multiple times.

If X and Y are friends, and Y and Z are friends, then X and Z are also friends. There is no friendship that cannot be derived from the M given facts.

Takahashi the evil wants to divide the N persons into some number of groups so that every person has no friend in his/her group.

At least how many groups does he need to make?

Constraints

2 \leq N \leq 2\times 10^5

0 \leq M \leq 2\times 10^5

1\leq A_i,B_i\leq N

A_i \neq B_i

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
\vdots
A_M B_M

Output

Print the answer.

Sample Input 1

5 3
1 2
3 4
5 1

Sample Output 1

3

Dividing them into three groups such as \{1,3\}, \{2,4\}, and \{5\} achieves the goal.

Sample Input 2

4 10
1 2
2 1
1 2
2 1
1 2
1 3
1 4
2 3
2 4
3 4

Sample Output 2

4

Sample Input 3

10 4
3 1
4 1
5 9
2 6

Sample Output 3

3



Sample input:
5 3
1 2
3 4
5 1


Sample output:
3

Submission status: Accepted

Solution code:
# This code is generated by [Atcoder_base64](https://github.com/kyomukyomupurin/AtCoder_base64)
import base64
import subprocess


exe_bin = "e??420s#R400000000000{}h%0RR91pcDWA00000KmY&$000002tNP-0000000000Kma%Z2>?I<9snHx1^@s61ONa4KmY&$00000KmY&$00000KmY&$00000_yGU_00000_yGU_000002mk;8000000{{R31ONa4I066w00000I066w00000I066w000008~^|S000008~^|S000000RR91000000RR911poj5000000000000000000000000000000Djxs<00000Djxs<00000001BW000000RR911^@s6C@la000000C@mlW00000C@mlW00000@B#n;00000ke>(u00000001BW000000ssI21^@s6KrH|O00000KrJ8u00000KrJ8u000005CQ-I000005CQ-I000002mk;8000001ONa41ONa4R004100000R004100000R004100000L;wH)00000L;wH)000001ONa400000P~~)F1ONa4KpX%700000KpX%700000KpX%700000WB>pF00000WB>pF000001ONa400000QRQ@G1^@s6000000000000000000000000000000000000000000000000005C8xG00000Qss1H1ONa4C@la000000C@mlW00000C@mlW00000*a83m00000*a83m000000RR9100000FKlUIHZ(76WG!rIZgqGqcsMpKHZ(4CZ!R(b1ONa45C8xG0RR91M^04$000000{{R30ssI2000001ONa46aWAK0{{R3M^04$j(Th;?X0oE?;xK}h}WmtOcLf00ssI26#xJL0RR911^@s6001BWfB_Hy6#xJL761SMDIJU)XH{Vk000000000000000000000000000000Z2$lO5&!@I00000000000000000000LID5(A^-pY00000000000000000000836zQ5&!@I00000000000000000000{r~^~5&!@I00000000000000000000CjkHe5&!@I000000000000000000003;_TD5&!@I00000000000000000000h5!Hn5&!@I00000000000000000000q5uE@5&!@I00000000000000000000=Kufz5&!@I00000000000000000000JOKaz5&!@I00000000000000000000r~m)}5&!@I00000000000000000000Q2_t|5&!@I00000000000000000000jQ{`u5&!@I000000000000000000009{>OVAOHXW00000000000000000000&Hw-a5&!@I00000000000000000000Spfh55&!@I000000000000000000005C8xGAOHXW00000000000000000000I{*LxAOHXW00000000000000000000H30ws5&!@I00000000000000000000RR9105&!@I00000000000000000000AOQdX5dawgATS^R000002mk;800000_y7O^5dawgFfbqh000002mk;8000000BmVub97{5D=RK@Z!R_fUtec!Z*E_6bYXIIUta)UNmNZ=WMy(?XK8bEWpY$aLu_wuWmI8eY-IpnNmNZ=a%E>}b97~LR82!{Z*FB&VPb4$0AE^8Q*=0KZ*yN_VRL0PNp5L$L@`Bn0AE^DbTKzyUvy}4Z+Bl}VPs!nY;131b^u>mWNc7&0AF8ccz9oMWpZ<GZeeU`ba`KPFaTd#Zg*_}Us_I6bU0~mb6;X%b7eG1ZfSHwF-3L&Y-wU=V`E=)E^}`#F#umxZg**JWM5Kcb9HTH0BmVuV=i-VE;ayPUvqR}V{2byXlq|)VQFjtb97{BZUA3jVRLh3a&%v2VQFjtUteQ*VP9c%Wq4_H0BvP$b7gb@b97{Hb#wq<Uu|V=ZEtpEUt?%%0A_b`X>?@(W^!d=WB^}ZV|Za-W@&C=Y-xIB0BvP$ZEtpE0AF8hX<}nvb97;HbYE>@X>I^VLqlIPE-(N?SXe<qNnbH8GXO_SNkT(dSYI<PGyq3TNkT(kGA=X#M@&gVLtip3GcGg$M@&gVLtip3GA=a$000930ssO40ssU60ssR50{{g80ssR50ssa8000L70ssI2000620{{X50ssI2000000RRC2zyJUM5C8xGAOHXWP$qc`000L7YXJZN000000RRF30RR915C8xGFaQ7m)30j<000I6a{&MV5C8xGbSaVu00093egOag000000RRI4-2eap5C8xG000006lrM<000F5iU9xs5C8xGbQx(0000C4lmP$$5C8xGbsA|200062paB2?00000C@mlW000002mk;800000pcMcB00000FfAYe000002mk;800000uoD0P00000I4vLm000002mk;800000U=;uW000002rwW3000002mk;8000002rwW300000&@UhW000001^@s60ssI20000000000*e@Ue000001^@s64gdfE0000000000;4dHm000001^@s65C8xG0000000000=r14u000001^@s65dZ)H0000000000@Gl?$000001^@s65&!@I0000000000_%9#;000001^@s66aWAK00000000005HKJB000000RR914FCWD0000000000ATS^R000001poj56#xJL0000000000Ffbqh000001poj5761SM0000000000XfGfD000002LJ#70RR910000000000a4#SL000002LJ#70{{R30000000000crPFT000002LJ#71ONa40000000000fG;2b000002LJ#71poj50000000000h%X=j000002LJ#71^@s60000000000kS`zr000002LJ#72LJ#70000000000m@gmz000002LJ#72mk;80000000000pf4Z*000002LJ#72><{90000000000s4pM@000002LJ#73IG5A0000000000urDA0000002LJ#73jhEB0000000000xGx|8000002LJ#73;+NC0000000000z%L*G000002LJ#74*&oF0000000000$S)uO000002LJ#76951J0000000000NQ3MMNQ(s(CLjPvg}`(I|IkQ-#0bLx|21+YAOQa*bR{4F4<A4P|0QxIAOL6p0002#;Q#;s|0QZAAOL6q0002#(EtDc|0QB2AOL6r0002#!2kdM|0P-_AOL6s0002#u>b%6|0Pl-AOL6t0002#p#T5>|0PN#AOL6u0002#kpKVx|0O~tAOL6v0002#fdBvh|0OylAOL6w0002#aR2}R|0OadAOL6x0002#VE_OB|0OCVAOL6y0002#Q2+n`|0N<NAOL6z0002#K>z>$|0NnFAOL6!0002#F#rGm|0NP7AOL6#0002#ApigW|0N0~AOL2N0000000000L03UmNR2(k!6X1dRY6o$Q%HmCXh@B8Bq(G^iv%So0000;i9{q=F~I0y3jhE}jdUa|NR2&}!6X3aPzwM6NMl?iC`iXdBsc&7002nGL?l1}0000;$3!GZ00000NQK*pTqH0Lg}4O(07#7;T)`v&NR4bHFb^Mq00000M2lo3EJ2M#B>zQ)<cUNiEDwYU1ONa`i!D0AC;&){H7mg=08BaV4}^*X000lR20RLM1Uw*hCrFJ(0S_MlNQngr!6*O^wg^ax#z=#}0f6}+bn1Zl3UuX3IrVhDNR37mNjb$2hSLE607#1s+`uRR54Hh3Ef0j50RR9zFAt8D1ONa<F~CTJ!2v}v<PRT!00000NQur!i4Cs6C;&r^6r@OvNdbf44@8Y5P!G02|2!{$-$jJLbOS;6+)O#{4}_iq000lR20S2i2RsUOA`c$`NQ1@!NQpIVz$gF@wgx;PbnZL~bm~bt^$&y@1ONa?jYbqnImHi#oB;p;NQ)Ikz$gF@wgNmY4}{tP002BM502pl001%eG0A2RA4C8EjSPu{;15WH!U0H$6&JuL0F4Yt54Hk4FMs7gg!Xg-_t}H#0YQW80S}0%1pokxbR;l|$oJ5}=pQ-p51hh;!ViRy1poj+IrI;WhXnutNQ+b?I89^hNx|g;N{u`!iwA|k4~dQe002y5=}E!m0!ocMDvJk&zz>O80RR9&Im{1)Q2zh_Nn^xFjWmKtW5Gy`6oQLBivl^veiT88z=`-liOfWa$4QCMNQv@HiN*o=i3UW8BIz3b|Nmw#4<Cd800000NR3JXNQn(qzbF6?wn70sFAt6g1ONa?iORkK0002#4FCWC4<A4PNR4p;NQpHqzbF6?wm|_rFAt8`0{{R>iSa?W0RR91=}rFs{|_GkNh$TY5C8-KNQvJ}iRw;`BrE87{Qv(*iw%MzAON}m00aQO0RR91OeyM2iRb98{Qv(+0mMj+4b#3P08EJ`)V?SHLB<3m07!|O000C4Op7hSz9<0c*!}<i4<A4PO^NQg5C8-KNQvJ`DfUc>@=lE`Gw2rl|Nlsf4Id&P0J;DG1OUDP0000?De_E-@90YW|Nlt=#Yl}6aK0n}Oo=UVz9;}e#zg=CNQs*O00aQ(6aN4I4<Cd800000ImUiMOk?muiwv@b$q$J+0ssJs2Z_Pyi~j%r4<A4PImUh>Ok?myizKo|h2#&3^8o+=L5ajfi6@J6BrrMg4~$Iy|Nlsh4Py-e07#8B;0yo&NR2(=3;+PSRsjG2=v({${|_GkNQ(_|As_&{000C4z5xIL07!}7=%4%l|40GYNR2hcy(9ogi3P^JC;-L)01vhUNQs*O00aO`i!HLfC;&Vl4~0Da|NrSF{r~?DA4C8Exex#Z05Q@`iS9^=-{=PW|Nlsf4G$q80J;DG1OUDP0000;iQniw`~Uw)0oX{1-bjfBXuT)^#sB~hwgX6sn*aa=08EQ5RJ|wwJRlE*E&TugJPHqlCH(*Y=|cSf{|_I400000i$o+Sg}{Dzi%cXig~<<&>H+`&NQ+b?I5FEyjcg<^>nLUqA4C8E_t-%>#6%BF;Eh88IYcBVenyK-Brr&W!vQ(L5010~002mhES&%V002mhG%AY*g}`{sImi!<!v6pNOk?m$jXbhMiw8x8zz>Pr0001q28##ls}COlNR2&7ARquliRS3>2LJ#_ixq;rBmhW_9Wx*x07#94000C4NR3JXNIAg|gGB)V0LB6eNQ-<VI7ov9SG*(u0Z4`abOq=I`v3niz(|W+Bv@ofGaMx-0000Fg|-3!07!$xXj@%DTtQtyUO`{ONQ*T&yeI(arThQ?NQurxG34o*`~Uw$Ipz<J7XJVLO=J8*iv+rbzz>N*0RR9-i6pX0jXWyp>;3=#InED`^8Nq+Ok?>%iv+rbzz>Q40000&i43wzjXWxe$myZ||NlWb$PbOn{r~?-W5A0vf=rD(g#Z8m0EPAsiK_qr07#8If<}o1vPg|IDnyCE>GJ;n|46w1|NsC0|NlQoIl~W!Gy(tsNR2F=00000NQv+0IQjqoNR13AG16v`#{`i7|Ns9;gTetwIn#CUNQ-<VI7o?1BtS@sL?k#!iA*F&NQM6ogz)+Q|LE@c|NrUc`Tze#G34p5`v3ni$>}ot|Nlsf4YM8~07xm?z5xIL07!}7=rj5M|44})1iK^vNQv6%mHz+#InED_0{#F0Ok>7Ei#&pb{|||Z0000;W5z;>G&)I%!09jl|NlA0502dY|Nl&5z(R`*f`!R>NkWMPx{1N*<Np8uImQo;zWo3HOk?0ei#(!*|9K2Ti3GYqiNxuk{{R0u{tu3y{Qv(<W5+^^1cHUY4~d5W002UXJfeyC>(x2V4~~HR|Nl&5$wG?+iiN-riHZOK078ijf{DoMm^sf6jbZ%%|4d`gLW=~7g}@Jqi~s-tLWw+riT>$S|Ns9;jSb2P002mhH75xG07#8JJP7~*x?=$V0O+Fk|Nlsh4QmMi07#8B2nhfHNR2%S2><}PZUF!Q=!5tF|2f7Fjsg7t|4d`ZLW?wth4v4Lod5s;LWu-|iO1<z|Ns9v#t)9)`~Uw)W5|m%iiP$MiL(Fz078ibiiyGLRsaA0Imi!<zWe|GNMp#0G>V1xc`8DQ1d55r=~w^%|455`BsfTk!$^hybOq=^_y7M$iQnj%_y7OsRQLb?Oo{JEiA*FIOo>b+5KM_gBnarO0ssI=i&P{yNQ+D)7)*;yBoIuCL?j4_1d8jX=&$zw|451NOo>b+7)*&oBoK*ABnaqv0ssI=i&P{yOp8n;7)*;qBoK>CBnU!@1d8b~|NsB#b^rhWNQv)AiA*FIOo>b+5KM_gBnaq10ssI=i&P{yNQ+D)7)*;yBoIuCL?j4_1d8bz|Ns9FA4C8EQ%H?H__!zlNR1tV93TMby!QY9NQ*r!93TKljTJT=AOJ{>HP^T(0O(To|Nlsh4ZFA`0J;DG1OPGiNQuwr4EF#3x&Z(L05SGRiQh<x1)I1i07!`ioVX|e=<oIa|45Cy0RRL5x<H%&05SIH-1YzeOpTKS00aO?i5*tBBmhM*$w9cy%*@OWA4C8ENsW5^Oo`S+iOGq`NQ3SHLHFRn>I01gk^#Ue!Gp;#h)w}WIsS>!b>KmR!2wBw!UREq`4A@n0CmM%NR1VR8z2BkjWxC#AOJ{>Js$x80O^|b|Nmw#4<Cd800000G3`l-(OyW2;z)z!@K97tjRmR(002mh4KoG+07#8J4EF#3{}mP+AOQ3aA4C8ENR2%~8z2BxNR0(K8z2BkIrvD4<#ZWHiv{W$AOJ{(z;q2=|KMgW4<Cd800000UBeF_KmcYg4<Cd800000NR2%K8z2BkjWzljAOKZJDgH=_<w(K)14xPRNWthoNCC!3(f)K8NQ(ur8Xy2jg}`(SUH{-_4<Cd800000UBeF_KmcYg4<Cd800000fIZO~AOHY$FGzzuUm73)098nd<#Y^4i#>`OAOPq+_5c6qNdN!;#s#SwAOHbf!w(;T00000^TTEjA4C8ERY-~DUFl~3|NmwWA4C8ENQ;+9oCE+!iw$BLAOOAr0000;Df;Q<^#A`4A4C8Eh4w*IRa1CfNQwQ6KRNe)R7i_W2uNezNWtR*NR1R3ivoqfc?w&J@LfS%!w(+-Imdo6Ok?0ei!`By_IVMB#)$%n@LOF$T*GD$A4C8ENQv+0sQ>@}NQ+enLWu;TNCDdG+DMHJ#03BVNR2f?1poj@jXgpI006pH0RRB#yz~G6W-bpOga7~l003r?K~+IiRZ~cb^+<{PNQ3MMNQ;*U00aO`i=zMl1OQ1n)DMIi0RR9&54Hp(JPLFKJRo%}NsUA#0S_O500000NQr|000aOJwg^dy#7Kj{0f6}+bn1Zl3UuX3In;EwNsUA#6i7M34~BvO0075D0000007#3I000C454Hk4Ep$yW(lN<AFMkN@GY=mCi&X%P6q1AB4~+y+iA4ZNi-Q0F1OP~lPytAZlK=n&01vi60X#2%*M!M*1NU73NQ1-(TU|k1L0!WSA4C8ENR2`PNQr|000aOJwn70sFMisKRRFmG0002%rVk$gOex|_iRMU&-${wpPK_ih=qvO8|454s#26p|x&QzK08EMJOeyNV0RR91=<o9X|49MFOo^ii00aO*#snk)NQs*O00aQ(GXMYo4<A4PNQ(`L7$5+;000C4z5xIL07!}7Nr~L(wDSM|NCDVLiGv6L1OUbW01vhUNQs*O00aO?i<1Zd1OPlB4}`M*|NlG+4}_}z|NrUC{{R1wK~+IiOpUJq00aP4Q%Q;ZiStN<><CDUuSlE(07#8R6iGS74~F&u004#C4}=~8000k&xB&nFf%~6^0RTyjyd(ht1ON|?)Bpegf&2g9^#u=)C;<Qff%|`!m;eut`~d&}f%`y04*)<9oyJ5Dw$4Bgw)RPb!3KlI1`i(qNMp`HxLFss(MW^o1nUWqNsFu`NSp)!iP(eg1VQ)U!RifZ!Vo6_04c-4;{r%y+lvGriPMQh4FE`k=>&oL4<`Tsf6BN70000<i>xF_oCE+!W6mk?NSMLn0!U-qNCCr00pCc2`3Mh#umAu6_Q3=Xg^>XO07!+&bPo@<2ll}Nh(!Pog|-0z08IgmBuJbD07!$x2wPo2TtQvKf%^|9004hzf&1qJ000k<9033TgZpC-jxzxO0Js4F006lI0002#3jqKC4<A4PNR34SNjb$2hCcxS07;94BuJbD0LB0?NrQwWNSp)!0Z4<y2wPo2TtQvK4<A4PLAeP4006!T0002#@c#e*LAeD0006!P0002#;Qs&rNQ(zZja3LpgW~u|iA4ZNi$pp2NQp!Z_(&<$NCD|cDep*w;rK{{`3Mh!J^%mzNQ2?{F~CTRGzUnDGy+J2zz9e=$a3%LA^-pX4<A4PNR34SNjb$2hSdN70LDcCElG=nBuJbD0QcKSjc5T$iL4|@oCE;r9RC0R4<A4PNQ(^#79apfiR!)q0000;Df&o>{pg19|Nl*iq$Eh31OVyd{r~@F4<Cd800000F~GS50000<iOK1E{{R1wLAeM3006!S0002#5dQ!FF~EcS3J;vXG08}SzygE&3J;yZNQ1!v>&=S?iA4a5L=XIlL=F7uasL1RNQ(`P6(9geiR!)q0000?DdJ3t=jaOX|Nl*iq$Eh31OVxp{{R0Ew?q&AW{E@%{^>jZ|Nlsf4ObN)07!}Iz5xIL08A<3Oo``AiRI|g@BjZziKHY*oCE;r0ssI14<A4PL03UmNr~4%RY6otjU^@$AOKZJjV&$`AOKTAiTz25_Dm_|NQ3MMNWuLB=%?=g|44=HbRaR?4<Cd800000Oo{qTiS|T^??L|*+(?7N0Z2LBb?Qii#0XnmL0myyL0&;$!;oe!4<Cd800000^TPlDNQ3MMNQ1-(!vFvP000000000000000000000RRF3ZDDC{E@NW=Fd#fVAb21qCLnkqJRojg00000Fd#fVAb21qCLnkqJRojgASNatFd#fVAbB7rCLnnrJRojg00000000000000000000000000000000000X>N2NRc>i-ZboTtWI8%?X?kTSX>N2W0000000000X>N2NRc>i-ZboTtWI8%>Z*O!cX>N2W0000000000c5i89AXRQ@Z*E3uZe%(-b#7^NWhiNGbSxlgZgeRC0UHB5WB>pF3jhEBpzZ(vumAu6fbReQ*Z=?kknaEg>;V7(aQFZJKmq^&VEF(4fB*mhaQXlL5CH%Hkoo`rC;<QfAo~CRU;zLCu>1f2oB;p;u>Sx5U;+RDApigWr~&{0000006aWAK000000eVsZ0eBDr8w>{skO2n}6aWAK8~^|S*!TbcD*ylh00000000006aWAK000000eVsZ0eBDr8w>{skO2SyBme*a8~^|S=<NUh-~a#s01gmF4j4)g3wH>B06!W#Dl;S^000006aWAKL;wH)pzZ(v2mk;800000000008~^|S000000eVnOQUC#X5C@yh5+DE@8w>{skO2Sy6aWAKBme*aSor_{8vp<R1fKx_00000GynhqlmGw#VEF(4ga7~l07MQDi~>Op7={Bu4j_XBVG0fyLk<u^4hTdGRtgRnK@Jc?4hTmJH~;_u%m4rYxcLA7j{yJx074EBjRHar7>ol!4j_gEK@KQ`1xgMu0<;PaC_xS&K@J!~4iG{P2u2G4OaK4?2mt^94Eq27`~m;~074EBjRHar7>ol*4j_gEK@KQ`1xXGt0|NmH4k$qmAVCfoLJkl@4hTUD0#ynQC_xS&K@J!~4iG{P2t^A3Pyhe`00961ob3Pq+Xw&v1jhgX074EBj{-st7>)x;4j_#LLJla51wjrlh6X_nID-d74xj-8a0LnuI6)3DK@KQF4j@7f7(xyZLJkN)3jhEB8~^|StN{Q3DE0sU<^TWy06`8Ag8~A}4hR4M00000L;wH)%mDxZNc{i*WdHyG074EBj{-st7>)x)4j_#LLJla51xOAsh6YFuID-dG4nT4aI6)3DK@KQF4j@7f7(xyZLJkN35C8xG6aoMMaQy%O0ssI20000000000|Nj91|Nj9ZDi#0$?ghaFqY(hZ3<aGK0H_TGqY(hI5Cs4L><|T=5C8xG00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000pcMcB00000uoD0P00000U=;uW000000RR91000000RR91000000RR9100000zyJUM000000RR9100000-2eap000003;+NC00000$O!-d000004FCWD00000WE%hg0000082|tP00000C@mlW000008vp<R000005C8xG000008UO$Q00000I4vLm000008~^|S000002mk;800000_5S~F00000m;wL*000001poj500000=mY=&000001^@s600000zybgO000003IG5A00000tN{Q3000003jhEB000007ytkO000006#xJL0000000000000000{{R300000P%j_=000000ssI200000H~|0v000006aWAK000002LJ#7000007XSbN00000kO%+(000002LJ#700000SO)+A000002mk;800000H~|0v000002><{9000007ytkO000009smFU000002mk;800000`~UxM000000RR9900000{{R1P00000$OZra00000|NsAQ000000{{R300000@c;jB00000lm-9*00000`TzfK000001ONa4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000KrJ8u0000000000000000000000000_6Yz0000001_}TG000007773W00000CJF!m00000HVOa$00000MhXA`00000Rtf+B00000W(oiR00000b_xIh00000h6(@x00000mI?p>00000rV0Q600000wh90M0000000000000000000000000000000000000000000000000000000000000000000000000002rwW3000000000000000M?*t8AShL0b#8QZAU7^GE-)=Kbz*gHbagR)F*q(TG$|lAE;TMN0000000000000000000000000000000000000000000000{{U4I066w000000000000000000000{{X5R0041000000000000000000000{{a6bOHbX000000000000000000000{{d7m;wL*000000000000000000000{{g8zybgO000000000000000000000{{j9=mY=&000000000000000000000{{mAlm-9*000000000000000000000{{pB$OZra000000000000000000000{{sCSO)+A000000000000000000000{{vDkO%+(000000000000000000000{{yE$O!-d000000000000000000000{{#F;0XW#000000000000000000000{{&GzzP5W000000000000000000000{{*H&<X$m000000000000000000000{{;IWE%hg000000000000000000000{{>JfExe+000000000000000000000{{^KKpX%7000000000000000000000{{{Ls2l(Q000000000000000000000{{~M03QGV000000000000000000000{|2NC@mlW000000000000000000000{|5OI4vLm000000000000000000000{|8PKrJ8u000000000000000000000{|BQP%j_=000000000000000000000{|ER05Bi`000000000000000000000{|HSATS^R000000000000000000000{|KT000000000000000000000RR911OV~>000000000000000000002><{90RRvH02}}S0000082|tP00000H2?qr0RRvHARGVy00000AOHXW00000V*mgE0RRvH;2Qt{0000082|tP00000j{pDw0ssyGuoD0P00000<^TWy00000q5uE@0RR~Qu*@g`000000RR9100000u>b%71OV~>00000000000000000000yZ`_I0ssyG&=ddw000000000000000z5oCK0ssyG5ETFb000000000000000(EtDd0ssyGU=;uW000000000000000=Kufz0RR~QI4~dp000000RR9100000_5c6?0RR;MI4vLm0000000000000009RUCU0ssyGpcMcB000000000000000DFFZg0RR*LC@mlW000000000000000u>b%71OV~>00000000000000000000NC5x<0RR#J{2l-R000000000000000000001OV~>00000000000000000000RsjG2000pHKpX%7000000000000000X#oHL0RR>NKrJ8u000000000000000asdDU000yKI4vLm000000000000000g8={l000yKC@mlW000000000000000mH_|&0RR^OP%j_=000000000000000tN{Q35dawgATS^R000002mk;800000zySaN5C9ke7%(6J000000000000000Z36%RAOIKu05Bi`000000000000000#{mEU5daVXfExe+000001ONa400000)&T$j5&!@I00000000000000000000`~d&}A^-pY000000000000000000007y<wQ5&#YW&<X$m00000+Xw&v000009RdIV5&!@I00000000000000000000F#-Sp5ds(h2rwW3000000000000000J^}y$A^;8muoVCR000008vp<R00000RRRD25&!@I00000000000000000000Z~_1TAp#fx5HKJB000002mk;800000Km-5)5&#bXWE%hg000000000000000i~;}v5dawgFfbqh000002mk;800000p8@~?5&!@I00000000000000000000x&i<I5&!@I00000000000000000000)B*qi5&!@I00000000000000000000aRUGV5&#YWpcDWA00000D*ylh00000=mG!$5&!@I00000000000000000000`vL#}5&!@I00000000000000000000#sdHV5&#PT$O!-d0000000000000007XttQ5ds(h7%(6J000000000000000BLe^cA^;8mU={!X00000j{yJx00000M*{!=A^;8m@D~6800000`~m;~00000YXblP5C9ke05Bi`000000000000000egOag5C9nfxXdU3000000000000000cmn_c5&!@I00000000000000000000ivs`v5C9nf7%(6J000000000000000mjeI*5&!@I00000000000000000000yaNCL5&#YW@EQOB00000WdHyG00000%mV-b5&!@I00000000000000000000;R65w5&!@I000000000000000000000t5g6AOHXW000000000000000000009s~dY5&!@I00000000000000000000HUt0w5&#YWU>g7c000000ssI200000Mg#x=5&!@I00000000000000000000Wdr~KAOHXW00000000000000000000bOZnZ5dawgKrkQx00000P@Dt+00000c?19eA^;8m&=mjx00000ga7~l00000jsySzAOHXW00000000000000000000s00825&!@I00000000000000000000yaWIMA^;8muoVCR000008vp<R00000o&W#<5dawgpv)uy000005C8-K00000(*ytj5&!@I000000000000000000000BvDuZZ2bE0AE^KPB~R>X>V>uX>MdRa&K>RMQKGbIbUB;Qbkl$Szks~PD4~lPflN70AE^KPB~R>X>V>uX>MdSb#7^NWkqReMKL*FUr<s-R8(1CMpaHjR7p=xUta)UT3SvyRc>i-ZboTtWHfVWdSyjvMKL*FUr<s-R8(1CMpaHjR7p=xUta)UM@&ybK}=s?b9G{0Nnd7ZZUA3eQ*=x?Utei&X>MtB0Aq4=b98lPW-em@WMy(?XK8bEWpZD1ZC_(-Z*FCC0AF8ZZ(nC@Z(?C=Uu1M|a&uo{b$9?{Z*6dFWprg^E;lwgH~?Q?WN%+*Y;R&=Y+qz_Z*p^AVRd+4W@&C|Utw}`VR>I=Zgg^a0A_MwZDn6%b!}~V0AF8ba$#*{Uu1P{ZFyg5ZfSI1VRCX|d0%C2baHtBUtdO2K}|(pMNULtUjScUM^05=MMz&pQbA2cUr0n!0AEB|PC-pcLjYf2X>MtBUtw}`VR>I=Ze##oUukY>bYEd|a$$L2b97;HbO2vROiw~VOkYn%MpH#pUsORtOhsP+b97{Hb#y>LM@&gVLtip3GA=a$Uu9%rbYTErNl#yMbYy96Uv+b3WB^}UQ*<#mUte@+a&LEEVqs)oVQg$~V|GA5M@&gVLs(c}GcGg$UteQ*VP9rxZeeU`dSyUBM@&gVLtip3GA=a$ZDDC{0BvP$b7gcuKu1hTLPK9NE;24P0AF8Zb8la0VQyq>WdL7VPBunib96~hH&AkEZggdGL^4Ho0AF8Wb8}^KbYEs+X>341M@&gVLtip3GA=a$L{~0yWo9m4UuSrDUvOn|b8l{8Y-x0PUv@A6b97{BZa_dsOi4mRUotK-E;RsOUu|V=ZEtpEUt?%%KtM-KNkT(kGA=VNGyq>;V|Za-VRU79X>>q9M@&gVLtip3GA=a$Us_~rP<B8-M@&gVLs(c}GcGg$Us`T=Z9qUrOi4mRSXf^(E;ImNUvqR}V{2byXlq|)VQFkYKu1hTLPK9NE;ImNUsO#)UqwztUta)UT23}bVRLjzPd8IzVQy|^ax`*fVPr{ZOldGhMMZW}R9^sJT23}bVRLjzPd89<X>N37ay55yX>?^tX-sJ_MMXt+R9^sJUu0o)VPA7}VRCc;W^!d=WI#YiOi4mRUotK-E;RsOUt)7}UvqR}a&!P+T251RIB9QlUt(c%Wi&}{X>>y|MRq_yM@&gVLs(c}GcGg$Uter#Vq;%pb9G;7ZfSG?ZDnn3Z+2xsKu1hTLPK9NE;24P0AF8ccz9oMWpZ<GZeeU`ba`KPFhD><SXe<qNnbH8GXP&nR83!GWpZU_X>)XCa#T%2Y;SI5RAFLlWdL7QZg**JWM5Kcb9HTHKtM-BLtis4FaTd)Y-wU+Ut@E1UuJ1;X#iheY-wU+UvqR}a&%v9VQFqaKu1hTLPK9NE;24P0AF8cZEtR0b97;HbYEWpW^Z+L0AE^8IaO|HZ*E3uZe%oaZ*O!(X#ihIR83!UWoKz~bY*f>O+##NZe>(qVr*pqW_NOFbY(z5M@&gVLtip3GA=a$Us_H!MqzVwNl!OWa%paKWpYF@MRovRT251RIB9QlUt(c%Wi&}{X>>#}MRq_yM@&gVLs(c}GcGg$04{TRZFFH`04{TMa&%#004{TAb98caVPXI-X>N37a&Q1HZf|sDE<r*`Ep%aL04{ECbY(7QZgnnVb!lv5Eoo!`E@y6aE@)wMXaFu`d2VxgZ2&H0d2VxbasV!8ZgnnpWpZ<AZ*BlCXKr;ac4cyNX>V>{asV!JWo%(CWO;4?E^=jTVJ>iNbO0`CZfSG?E^usgE@y9a04{W8cys_RW@&C|04{QGWMOn+04`-{UuJS)ZDn6*WO4v5WoTb!a$#*{04`@^V_#)>V`Xr3Uvyz&Y-Ip0X>MtBUtw}`VR-;9W@&C|Utw}`VR-;9WO;63ZE0fwE@WYJVE`^-b8`SLV{dJ3Wo~o;000000000000000000000000000000000000000000000000000000000000000000000000000000008vp<R0RR910ssI200000I066w00000I066w000008~^|S0000000000000000RR91000000000000000BLDyZ2LJ#70ssI200000R004100000R004100000AOHXW0000000000000001ONa4000000000000000F#rGn2LJ#70ssI200000bOHbX00000bOHbX00000Bme*a0000000000000001ONa4000000000000000L;wH)_W%EH0ssI200000m;wL*00000m;wL*00000C;$Ke000001poj5000002mk;8000000000000000P5=M^3jhEB0ssI200000zybgO00000zybgO00000C;|Wg000001^@s60RR912mk;8000007ytkO00000RsaA10{{R30ssI200000=mY=&00000=mY=&00000tN{Q30000000000000000RR91000000000000000UH||9|NsAQ0ssI200000lm-9*00000lm-9*00000E&u=k000001poj5000000ssI2000000ssI200000YXATM{{R1P0ssI200000$OZra00000$OZra00000kN^Mx000001^@s60{{R32mk;8000000000000000dH?_b1ONa40ssI200000SO)+A00000SO)+A00000H~|0v000001poj5000002mk;8000007ytkO00000ga7~l1ONa4LI3~&00000kO%+(00000kO%+(00000H~|0v000001poj57XSbN2mk;8000007ytkO00000jsO4v0RR911^@s600000$O!-d00000$O!-d000007XSbN0000000000000001ONa4000000000000000i2wiq0RR911^@s600000;0XW#00000;0XW#00000-~a#s0000000000000005C8xG000005C8xG00000lmGw#0RR911^@s600000zzP5W00000zzP5W000002mk;80000000000000002mk;8000002mk;800000od5s;0RR911^@s600000&<X$m00000&<X$m00000k`Mp@0000000000000005C8xG000000000000000qW}N^0RR911^@s600000WE%hg00000WE%hg000002><{90000000000000001ONa4000000000000000sQ>@~0RR910ssI200000fExe+00000fExe+00000zyJUM000000000000000AOHXW000000000000000u>b%70RR910ssI200000KpX%700000KpX%700000WB>pF0000000000000001ONa4000000000000000zW@LL0RR910ssI200000s2l(Q00000s2l(Q00000SONe50000000000000002mk;8000000000000000$p8QV0RR910ssI20000003QGV0000003QGV00000DgXcg0000000000000000RR91000000000000000+W-In4gdfE0{{R300000C@mlW00000C@la0000005C8xG0000000000000002mk;8000002mk;800000=Kufz4*&oF0{{R300000I4vLm00000I4uAG000002mk;80000000000000002mk;8000002mk;800000^8f$<1^@s60{{R300000KrJ8u00000KrH|O000005CQ-I000001^@s6000002mk;8000005C8xG00000m;e9(0RR910{{R300000P%j_=00000P%i)g00000umAu60000000000000002mk;8000002mk;800000`~Uy|0RR910{{R30000005Bi`0000005AXm000007ytkO0000000000000002mk;80000000000000000s#O32mk;80{{R300000ATS^R000007%%_;00000n4Aaz000000000000000AOHXW0000000000000002LS*80RR91FaQ7m0000000000000007%%_;00000DF6Tf0000000000000000RR91000000RR91000000RR910ssI200000000000000000000NH72Z00000xCj6M000008~^|SF#rGn2mk;8000007ytkO000002><{90{{R3000000000000000000000672v00000_yhm|0000000000000000RR910000000000000005dZ)H0{{R300000000000000000000_&ops000005CH%H0000000000000000RR91000000000000000"

open("./kyomu", 'wb').write(base64.b85decode(exe_bin))
subprocess.run(["chmod +x ./kyomu"], shell=True)
subprocess.run(["./kyomu"], shell=True)

Submission status: Accepted

Solution code:
from collections import deque

n, m = map(int, input().split())
ab = [list(map(int, input().split())) for _ in range(m)]

t = [[] for _ in range(n+1)]

for a, b in ab:
    t[a].append(b)
    t[b].append(a)

ans = 1
frag = [True]*(n+1)
d = deque()

for i in range(1, n+1):
    if not frag[i]:
        continue
    d.append(i)
    l = []
    while d:
        num = d.popleft()
        for j in t[num]:
            if not frag[j]:
                continue
            d.append(j)
            l.append(j)
            frag[j] = False
    ans = max(ans, len(set(l)))

print(ans)

Submission status: Accepted

Solution code:
n, m = map(int, input().split())
par = list(range(n))


def find(x):
    while par[x] != x:
        par[x] = par[par[x]]
        x = par[x]
    return x


def union(x, y):
    x1 = find(x)
    y1 = find(y)
    if x1 != y1:
        par[x1] = y1


for j in range(m):
    a, b = map(int, input().split())
    union(a - 1, b - 1)

s = [0 for i in range(n + 1)]

for k in range(n):
    s[find(k)] += 1


print(max(s))

Submission status: Accepted

Solution code:
mycode = r'''
# distutils: language=c++
# cython: language_level=3, boundscheck=False, wraparound=False
# cython: cdivision=True
# False:Cython はCの型に対する除算・剰余演算子に関する仕様を、(被演算子間の符号が異なる場合の振る舞いが異なる)Pythonのintの仕様に合わせ、除算する数が0の場合にZeroDivisionErrorを送出します。この処理を行わせると、速度に 35% ぐらいのペナルティが生じます。 True:チェックを行いません。

ctypedef long long LL
from libc.stdio cimport scanf, printf
from libcpp.vector cimport vector
ctypedef vector[LL] vec


cdef class UnionFind:
    cdef:
        LL N,n_groups
        vec parent

    def __init__(self, LL N):
        self.N = N  # ノード数
        self.n_groups = N  # グループ数
        # 親ノードをしめす。負は自身が親ということ。
        self.parent = vec(N,-1)  # idxが各ノードに対応。

    cdef LL root(self, LL A):
        # print(A)
        # ノード番号を受け取って一番上の親ノードの番号を帰す
        if (self.parent[A] < 0):
            return A
        self.parent[A] = self.root(self.parent[A])  # 経由したノードすべての親を上書き
        return self.parent[A]

    cdef LL size(self, LL A):
        # ノード番号を受け取って、そのノードが含まれている集合のサイズを返す。
        return -self.parent[self.root(A)]

    cdef bint unite(self,LL A,LL B):
        # ノード番号を2つ受け取って、そのノード同士をつなげる処理を行う。
        # 引数のノードを直接つなぐ代わりに、親同士を連結する処理にする。
        A = self.root(A)
        B = self.root(B)

        # すでにくっついている場合
        if (A == B):
            return False

        # 大きい方に小さい方をくっつけたほうが処理が軽いので大小比較
        if (self.size(A) < self.size(B)):
            A, B = B, A

        # くっつける
        self.parent[A] += self.parent[B]  # sizeの更新
        self.parent[B] = A  # self.rootが呼び出されればBにくっついてるノードもすべて親がAだと上書きされる
        self.n_groups -= 1

        return True

    cdef bint is_in_same(self,LL A,LL B):
        return self.root(A) == self.root(B)


cdef LL N,M,_
scanf('%lld %lld',&N, &M)

cdef UnionFind uf = UnionFind(N)
cdef LL a,b
for _ in range(M):
    scanf('%lld %lld',&a, &b)
    uf.unite(a-1, b-1)

print(-min(uf.parent))
'''

import sys
import os
if sys.argv[-1] == 'ONLINE_JUDGE':  # コンパイル時
    with open('mycode.pyx', 'w') as f:
        f.write(mycode)
    os.system('cythonize -i -3 -b mycode.pyx')

import mycode

Submission status: Accepted

Solution code:
mycode = r'''
# distutils: language=c++
# cython: language_level=3, boundscheck=False, wraparound=False
# cython: cdivision=True
# False:Cython はCの型に対する除算・剰余演算子に関する仕様を、(被演算子間の符号が異なる場合の振る舞いが異なる)Pythonのintの仕様に合わせ、除算する数が0の場合にZeroDivisionErrorを送出します。この処理を行わせると、速度に 35% ぐらいのペナルティが生じます。 True:チェックを行いません。

ctypedef long long LL
from libcpp.vector cimport vector
ctypedef vector[LL] vec


import sys
readline = sys.stdin.buffer.readline
read = sys.stdin.readline #文字列読み込む時はこっち

def ints(): return map(int,readline().split())


cdef class UnionFind:
    cdef:
        public LL N,n_groups
        public vec parent

    def __init__(self, LL N):
        self.N = N  # ノード数
        self.n_groups = N  # グループ数
        # 親ノードをしめす。負は自身が親ということ。
        self.parent = vec(N,-1)  # idxが各ノードに対応。

    cdef LL root(self, LL A):
        # print(A)
        # ノード番号を受け取って一番上の親ノードの番号を帰す
        if (self.parent[A] < 0):
            return A
        self.parent[A] = self.root(self.parent[A])  # 経由したノードすべての親を上書き
        return self.parent[A]

    cdef LL size(self, LL A):
        # ノード番号を受け取って、そのノードが含まれている集合のサイズを返す。
        return -self.parent[self.root(A)]

    cdef bint unite(self,LL A,LL B):
        # ノード番号を2つ受け取って、そのノード同士をつなげる処理を行う。
        # 引数のノードを直接つなぐ代わりに、親同士を連結する処理にする。
        A = self.root(A)
        B = self.root(B)

        # すでにくっついている場合
        if (A == B):
            return False

        # 大きい方に小さい方をくっつけたほうが処理が軽いので大小比較
        if (self.size(A) < self.size(B)):
            A, B = B, A

        # くっつける
        self.parent[A] += self.parent[B]  # sizeの更新
        self.parent[B] = A  # self.rootが呼び出されればBにくっついてるノードもすべて親がAだと上書きされる
        self.n_groups -= 1

        return True

    cdef bint is_in_same(self,LL A,LL B):
        return self.root(A) == self.root(B)


cdef LL N,M,_



N, M = ints()
cdef UnionFind uf = UnionFind(N)
cdef LL a,b
for _ in range(M):
    a,b=ints()
    uf.unite(a-1, b-1)

print(-min(uf.parent))

'''

import sys
import os
if sys.argv[-1] == 'ONLINE_JUDGE':  # コンパイル時
    with open('mycode.pyx', 'w') as f:
        f.write(mycode)
    os.system('cythonize -i -3 -b mycode.pyx')

import mycode

Submission status: Accepted

Solution code:
mycode = r'''
# distutils: language=c++
# cython: language_level=3, boundscheck=False, wraparound=False
# cython: cdivision=True
# False:Cython はCの型に対する除算・剰余演算子に関する仕様を、(被演算子間の符号が異なる場合の振る舞いが異なる)Pythonのintの仕様に合わせ、除算する数が0の場合にZeroDivisionErrorを送出します。この処理を行わせると、速度に 35% ぐらいのペナルティが生じます。 True:チェックを行いません。
ctypedef long long LL

import numpy as np
from functools import partial
array=partial(np.array, dtype=np.int64)
zeros=partial(np.zeros, dtype=np.int64)
full=partial(np.full, dtype=np.int64)

import sys
readline = sys.stdin.buffer.readline
read = sys.stdin.readline #文字列読み込む時はこっち

cdef ints(): return np.fromstring(readline(), sep=' ', dtype=np.int64)

cdef read_matrix(LL H,LL W):
    #return np.ndarray shape=(H,W) matrix
    lines=[]
    cdef LL _
    for _ in range(H): 
        lines.append(read())
    lines=' '.join(lines) #byte同士の結合ができないのでreadlineでなくreadで
    return np.fromstring(lines, sep=' ',dtype=np.int64).reshape(H,W)

cdef class UnionFind:
    cdef:
        public LL N,n_groups
        public LL[::1] parent

    def __init__(self, LL N):
        self.N = N  # ノード数
        self.n_groups = N  # グループ数
        # 親ノードをしめす。負は自身が親ということ。
        self.parent = full(N,-1)  # idxが各ノードに対応。

    cdef LL root(self, LL A):
        # print(A)
        # ノード番号を受け取って一番上の親ノードの番号を帰す
        if (self.parent[A] < 0):
            return A
        self.parent[A] = self.root(self.parent[A])  # 経由したノードすべての親を上書き
        return self.parent[A]

    cdef LL size(self, LL A):
        # ノード番号を受け取って、そのノードが含まれている集合のサイズを返す。
        return -self.parent[self.root(A)]

    cdef bint unite(self,LL A,LL B):
        # ノード番号を2つ受け取って、そのノード同士をつなげる処理を行う。
        # 引数のノードを直接つなぐ代わりに、親同士を連結する処理にする。
        A = self.root(A)
        B = self.root(B)

        # すでにくっついている場合
        if (A == B):
            return False

        # 大きい方に小さい方をくっつけたほうが処理が軽いので大小比較
        if (self.size(A) < self.size(B)):
            A, B = B, A

        # くっつける
        self.parent[A] += self.parent[B]  # sizeの更新
        self.parent[B] = A  # self.rootが呼び出されればBにくっついてるノードもすべて親がAだと上書きされる
        self.n_groups -= 1

        return True

    cdef bint is_in_same(self,LL A,LL B):
        return self.root(A) == self.root(B)


cdef LL N,M

N, M = ints()
AB=read_matrix(M,2)-1
cdef UnionFind uf = UnionFind(N)
cdef LL a,b
for a,b in AB:
    uf.unite(a, b)

print(-np.min(uf.parent))
'''

import sys
import os
if sys.argv[-1] == 'ONLINE_JUDGE':  # コンパイル時
    with open('mycode.pyx', 'w') as f:
        f.write(mycode)
    os.system('cythonize -i -3 -b mycode.pyx')

import mycode