Luke Skywalker got locked up in a rubbish shredder between two presses. R2D2 is already working on his rescue, but Luke needs to stay alive as long as possible. For simplicity we will assume that everything happens on a straight line, the presses are initially at coordinates 0 and L, and they move towards each other with speed v1 and v2, respectively. Luke has width d and is able to choose any position between the presses. Luke dies as soon as the distance between the presses is less than his width. Your task is to determine for how long Luke can stay alive.

The first line of the input contains four integers d, L, v1, v2 (1 ≤ d, L, v1, v2 ≤ 10 000, d < L) — Luke's width, the initial position of the second press and the speed of the first and second presses, respectively.

Print a single real value — the maximum period of time Luke can stay alive for. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.  Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if .

NoteIn the first sample Luke should stay exactly in the middle of the segment, that is at coordinates [2;4], as the presses move with the same speed.In the second sample he needs to occupy the position . In this case both presses move to his edges at the same time.

var
  ans:double;
  d,l,v1,v2:longint;
begin
  readln(d,l,v1,v2);
  ans:=(l-d)/(v1+v2);
  writeln(ans:0:6);
end.

var pr,t,d,l,v1,v2:longint;
begin
readln(d,l,v1,v2);

writeln((l-d)/(v1+v2):0:6);

end.

var
	d, l, v1, v2: integer;
	ans: real;

begin
	readln(d, l, v1, v2);
	ans:= (l - d)/(v1 + v2);
	writeln(ans:0:10)
end.

var d,l,v1,v2:real;
    begin
    readln(d,l,v1,v2);
    write((l-d)/(v1+v2));
    end.

var
  d,l,v1,v2:integer;
begin
  read(d,L,v1,v2);
  write((L-d)/(v1+v2));
end.

var v,d,l,l1,l2,v1,v2,q,w,e,r:longint;
t:real;
begin
readln(d,l2,v1,v2);  l1:=0;
v:=v1+v2; l:=l2-l1-d;
t:=l/v;
writeln(t:20:20);
end.

Program a;
var d,l,v1,v2,s,v:integer;
    t:real;
begin
read(d,l,v1,v2);
s:=l-d;
v:=v1+v2;
t:=s/v;
write(t:0:6);
end.

program z1;
var i,j,n,k,l,r,v1,v2,d:longint;
res:extended;
begin
readln(d,r,v1,v2);
n:=r-d;
res:=n/(v1+v2);
writeln(res:0:10);
end.

var d,l,v1,v2:longint;
begin
  read(d,l,v1,v2);
  writeln((l-d)/(v1+v2):0:8);
end.

var ans,d,l,v,v1,v2:real;
  begin
    read(d,l,v1,v2);
    v := v1+v2;
    ans := (l-d)/v;
    write(ans:18:6);
  end.

var
d,l,v1,v2:longint;
ot:real;
begin
 readln(d,l,v1,v2);
 ot:=(l-d)/(v1+v2);
 write(ot:0:6);
end.

var d,l,a,b:longint;
begin
    readln(d,l,a,b);
    writeln((l-d)/(a+B):0:6);
end.

var
  d, l, v1, v2 : longint;
  t : real;//double;
begin
  read(d, l, v1, v2);
  l := l - d;
  t := l / (v1 + v2);
  writeln(t : 0 : 6);
end.

var
  d,l,v1,v2:longint;
  kq:real;
begin
  read(d,l,v1,v2);
  kq:=(l-d)/(v1+v2);
  write(kq);
end.

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var a,n,v,v2:Int64;
begin
read(a);
read(n);
read(v);
read(v2);
n:=n-a;
Writeln((n/(v+v2)));
end.

program save_luke;
var
t:real;
d,L,v1,v2:longint;
begin
readln(d,L,v1,v2);
t:=(L-d)/(v1+v2);
writeln(t:0:6);
readln;
end.

Const fi='';
      fo='';
var a,b,c,d,l,r:Longint;
Procedure DocFIle;
var f:TEXT;
begin
        Assign(f,fi);Reset(f);
        Read(f,a,b,c,d);
        Close(F);
end;
Procedure GhiFIle;
var f:TEXT;
begin
        Assign(f,fo);Rewrite(f);
        l:=0;r:=b;
        while (r-l)>a do
        begin
                l:=l+c;
                r:=r-d;
        end;
        Write(f,(c*r-a*c+d*l)/((d+c)*c):0:6);
        Close(F);
end;

begin
        DocFIle;
        GHiFIle;
end.

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
    var
       d,l,v1,v2:integer;
begin
 readln(d,l,v1,v2);
 writeln((l-d)/(v1+v2):1:6);
end.

program sum_delit;
var
  d,l,v1,v2,vs:longint;
  t:extended;
begin
  {Assign(input,'input.txt');
  Reset(input);
  Assign(output,'output.txt');
  Rewrite(output);}

  readln(d,l,v1,v2);

  vs:=v1+v2;

  t:=(l-d)/vs;

  writeln(t:0:6);

//Close(input); Close(output);
end.

program lukea;

var
  d,length,v1,v2,l,r,t:word;
  k:real;

begin
  readln(d,length,v1,v2);
  t:=v1+v2;
  k:=0;
  while length>d do begin
    l:=0;
    while l<=v1 do begin
      Inc(l);
      Dec(length);
      k:=k+(1/t);
      if length=d then break;
    end;
    if length=d then break;
    r:=0;
    while r<=v2 do begin
      Inc(r);
      Dec(length);
      k:=k+(1/t);
      if length=d then break;
    end;
    if length=d then break;
  end;
  writeln(k:0:6);
  readln;
end.

var n,i,j,k,d,a,b:longint;
    r:real;
begin
  readln(n,d,a,b);
  writeln((d-n)/(a+b):0:6);
end.

var a,b,c,d:real;
begin
readln(c,d,a,b);
write((d-c)/(a+b):0:6);
end.

var i, j, d, l, v1 ,v2:longint;
begin
readln(d,l,v1,v2);
l:=l-d;
write(l/(v1+v2):1:6);
End.

var d,L,v1,v2:real;
begin
read(d,L,v1,v2);
writeln((L-d)/(v1+v2));
end.

program A;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
   d,l,v1,v2:real;
begin
   readln(d,l,v1,v2);
   writeln((l-d)/(v1+v2):1:7);
   readln;
   readln;
end.

var d,l,v1,v2:int64;
begin
  read(d,l,v1,v2);
  write((l-d)/(v1+v2):0:12);
end.

Program uyf;
Var d,l,v1,v2,res:Real;
Begin

  read(d);
  read(l);
  read(v1);
  read(v2);
  l:=l-d;
  res:=l/(v1+v2);
  writeln(res);

End.

var a,b,c,d,n:real;
begin
read(a,b,c,d);
writeln(abs(a-b)/(c+d));
end.

var
 d,l,v1,v2:extended;
begin
 readln(d,l,v1,v2);
 writeln((l-d)/(v1+v2):0:6);
end.

var
  d, l, v1, v2: extended;

begin
  readln(d, L, v1, v2);

  l := l - d;

  if v1 - v2 >= 0 then
  begin
    writeln(L / (v1 + v2):5:6);
  end
 	else
  if v1 - v2 < 0 then
  begin
    writeln(L / (v2 + v1):5:6);
  end;
end.

Var d, v1, v2, m1, m2, l, t: real;
  Begin
   Read(d, l, v1, v2);
   t:=(l-d)/(v1+v2);
   Write(t:1:6);

  End.

var a,s,d,f,g,h:real;
begin
read(a,s,d,f);
write((s-a)/(d+f));
end.

var pr,t,d,l,v1,v2:longint;
begin
readln(d,l,v1,v2);

writeln((l-d)/(v1+v2):0:6);

end.

var
  d,l,v1,v2:double;
begin
  readln(d,l,v1,v2);
  writeln((l-d)/(v1+v2));
end.

Var d , L , v1 , v2 : Longint;

Begin
    Read(d , L , v1 , v2);
    Writeln((L - d) / (v1 + v2));
End.

var d,l,v,v2:longint;
    otv:real;
begin
 read (d,l,v,v2);
 v:=v+v2;
 l:=l-d;
 otv:=l/v;
 write (otv);
end.

var d,l,v1,v2:longint;
t:real;
begin
  readln(d,l,v1,v2);
  t:=(l-d)/(v1+v2);
  writeln(t:0:6);
end.

{$APPTYPE CONSOLE}
{$R+,Q+,I+,O-}
uses SysUtils,Math;
var n,m,i,j,l,k,a,b,d:longint;
begin
  //reset(input,'input.txt');
  //rewrite(output,'output.txt');
  readln(d,l,a,b);
  writeln((l-d)/(a+b):0:6);
  //readln;
end.

var d,l,v1,v2,k:LongInt;
    s,t:extended;
Begin
  Read(d,l,v1,v2);
  l:=l-d;
  s:=l/(v1+v2);
  t:=s;
  Write(t:0:6);
End.

{$Mode Objfpc}
{$Macro On}
{$Define maicute:= for i := 1 to n do}

Uses
  Math;

Const
  maxN = round(1e5);
  maxM = round(1e6);
  oo = round(1e10);

Var
  fi, fo : textfile;
  n , d, l, v1, v2: Integer;

Procedure Openfile;
begin
  Assign(fi, ''); reset(fi);
  Assign(fo, ''); rewrite(fo);
end;

Procedure Init;
begin
end;

Procedure Enter;
begin
  ReadLn(fi, d, l, v1, v2);
end;

Procedure Solve;
var
  c , khoangcachd, khoangcachconlai, khoangcachchet : Extended;
begin
  c := d / (v1 + v2);
  khoangcachd := c * v1;
  c := l / (v1 + v2);
  khoangcachchet := c * v1;
  khoangcachconlai := khoangcachchet - khoangcachd;
  writeln(fo, khoangcachconlai / v1 :0 : 6);
end;

Procedure Printresult;
begin
end;

Procedure Closefile;
begin
  Close(fi);
  Close(fo);
end;

Begin
  OpenFile;
  Init;
  Enter;
  Solve;
  Printresult;
  CloseFile;
End.

var i,j,r,n,d,v1,v2:longint;
    ans:real;

begin
    read(d,r,v1,v2);
    ans:=(r-d) / (v1+v2);
    write(ans:0:6);
end.

var
	d,l,n,m	: integer;
begin
	readln(d,l,n,m);
	write((l-d)/(m+n):0:10);
end.

program fsdaf;
var d,l,v1,v2:integer;k:real;
begin
read(d,l,v1,v2);
write((l-d)/(v1+v2));
end.

var
	n, l, r, k, l2, r1, r2: longint;
	a, b: array of integer;

begin

	readln(n, l, r, k);
	writeln((l-n) / (r+k));

end.

var d,l,v1,v2:int64;
begin
  read(d,l,v1,v2);
  write((l-d)/(v1+v2):0:12);
end.

var
d,l,v1,v2:longint;
t:real;
begin
readln(d,l,v1,v2);
t:=(l-d)/(v1+v2);
writeln(t);
end.

{$MODE OBJFPC}
uses
        Math;
const
        {$IFDEF ONLINE_JUDGE}
        InputFile  = '';
        OutputFile = '';
        {$ELSE}
        InputFile = '';
        OutputFile = '';
        {$ENDIF}
       // maxN = ;
var
        fi, fo: TextFile;
        d, L, v1, v2: Integer;

procedure Enter;
var
        i: Integer;
begin
        Assign(fi, inputFile); Reset(fi);
        Assign(fo, outputFile); Rewrite(fo);
        Readln(fi, d, L, v1, v2);
end;

procedure Solve;
var
        i: Integer;
begin
        Writeln(fo, ((L - d)/(v1+v2)):0:6);
end;

procedure Clean;
begin
        CloseFile(fi); CloseFile(fo);
end;

{ MAIN }
begin
        Enter;
        Solve;
        Clean;
end.
{ END OF MAIN }

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var z,a,b,c,d:integer;       x:extended;
begin
readln(a,b,c,d);
x:=1000000;
z:=0;
x:=b-a;
x:=x/(c+d);
writeln(x);
readln;
end.

program yan;
  uses math;
  var a,b,c,x,y:longint; ans,v:extended;
begin
  readln(a,b,c,x);
  writeln((b-a)/(c+x));
end.

var d,l,v1,v2,i,j:longint;
begin
  readln(d,l,v1,v2);
  writeln(((l-d)/(v1+v2)):0:6);
end.

var a,b,c,d,s,r:int64;
ot:real;
begin
  readln(a,b,c,d);
  s:=c+d;
  r:=b-a;
  ot:=r/s;
  writeln(ot:0:6);
end.

var
  f,d,m,l:double;

begin
  readln(f,d,m,l);
  f:=(d-f)/(m+l);
  Write(f:0:7);
end.

  {$APPTYPE CONSOLE}
const nn=3; besk=200000000000000;
   nnn=2000000;  eps=1e-11; modul=1000000007;
 type matr=array[1..3,1..3] of extended;
   mat=^matr;
 label 1,2,3,4;

var i1,j1,k,step,kt,ppp,god,day,mon,mask,i0,j0,i,j,start,finish:longint;
newdl,dloch,kol,shag,m,t,ii,jj,l,r,p,p3,pos,ll,bb,pp,tt,ot1,ot2,s,kold,n:int64;
q,t1,t2,p4,cc,p1,p2,ot,dist1,vt,zap,ba,by,aa,ay,kk,centr,koef:int64;
flag2,flag1,flag:boolean;
ch1,ch2,ch:char;
str:array[-10..1200000] of matr;
prob,ccc1,v,rr,h1,h2,h,r1,r2,aaa,bbb,ccc,hh,po,pt,doltek,dolpred:extended;
next,prev,x1,x2,y1,y2,d,och,newoch,f,x,y,fact,c,b,a,prost:array[-100000..1000000] of int64;
oldzan,oldmarked,zan: array[0..330006] of boolean;
gr:array[-1..1001,-1..1001] of boolean;
agor,aver,ssumgor,ssumver,sgor,sver,udd,dostl,dostr: array[-100..600,-100..600] of int64;
det,ott :double;
dd:matr;
d3,d1,d2,dist,edin:matr;
ss,ss1,ss2:string;
za:array[-10..600,-10..600] of boolean;
marked,dost,newdost:array[-10..700000] of boolean;
ssnew:array[-10..1000000] of char;
pole:array[-10..610,-10..600] of char;
name:array[0..2000] of string;
function min (a,b:int64):int64;begin min:=b;if a<b then min:=a;  end;
function max (a,b:int64):int64;begin max:=b;if a>b then max:=a;  end;

 function nod(x,y:int64):int64; var z:int64;
begin   repeat  z:=x mod y;x:=y;y:=z;   until  z=0 ;  nod:=x;end;

function degg(p,deg:int64):int64; var pp,q:int64;
 begin if deg=0 then degg:=1 else begin   if odd(deg) then degg:=(degg(p,deg-1)*p) mod modul else
 begin q:=(degg(p,deg shr 1)) mod modul; degg:=(q*q) mod modul;   end; end;   end;

begin
 { assign (input,'input.txt');reset(input);
      assign (output,'output.txt'); rewrite(output);
  }
   n:=4;
  for i:=1 to n do read(a[i]);
   write((a[2]-a[1])/(a[3]+a[4]):0:9);

   1:          close(output);
end.

var
  a,s,d,f:real;
begin
  read(a,s,d,f);
  writeln(abs((a-s)/(d+f)));
  readln;
  readln;
end.

var a,b,c,d,n:real;
begin
read(a,b,c,d);
writeln(abs(a-b)/(c+d));
end.

program k;
var v1,v2,l,d:longint; u:real;
{procedure qs(l,r:longint);
var i,j,x,y:longint;
begin
i:=l; j:=r;
x:=a[(l+r) div 2];
repeat
 while a[i]<x do inc(i);
 while a[j]>x do dec(j);
 if i<=j then
 begin
 y:=a[i]; a[i]:=a[j]; a[j]:=y; inc(i); dec(j);
 end;
until i>j;
if l<j then qs(l,j);
if i<r then qs(i,r);
end;}
begin
{assign(input,'input.txt');
reset(input);
assign(output,'output.txt');
rewrite(output); }
read(d,l,v1,v2);
u:=(l-d)/(v1+v2);
write(u:10:7);

end.

program z1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  l, d, v1, v2: longint;
  t: real;
begin
  read(d, l, v1, v2);
  t := (l - d) / (v1 + v2);
  write(t:0:6);
  readln;
  readln;
end.

var d,l,v1,v2:int64;
begin
  read(d,l,v1,v2);
  write((l-d)/(v1+v2):0:10);
end.

var d,l,v1,v2:real;
begin
  read(d,l,v1,v2);
  write((l-d)/(v1+v2):0:8)
end.

program safa;
var d,t,v1,v2:word;
v:longint;
otv:real;
begin
read(d,t,v1,v2);
v:=v2+v1;
otv:= abs((d-t) / v);
write(otv:0:6);
end.

var d,l,v1,v2:integer;t:real;
begin
readln(d,l,v1,v2);
l:=l-d;
t:=l/(v1+v2);
write(t:0:20);
end.

var
d,L,v1,v2,q:longint;
w:real;
begin
read(d,L,v1,v2);
q:=v1+v2;
w:=(L-d)/q;
write(w:0:6);
end.

var d,l,v1,v2:real;
begin
 read(d,l,v1,v2);
  v1:=v1+v2;
  l:=l-d;
  write((l/v1):1:6);
end.

program a;
var d,l,v,w:longint;
begin
  readln(d,l,v,w);
  writeln(((l-d)/(v+w)):0:6);
end.

var d,l,a,b:longint;
begin
    readln(d,l,a,b);
    writeln((l-d)/(a+B):0:6);
end.

var
    d, l, v1, v2: Integer;

begin
    Read (d, l, v1, v2);

    WriteLn ((l - d) / (v1 + v2))
end.

var l,d,v1,v2:longint;
begin
 read(d,l,v1,v2);
 write((l-d)/(v1+v2));
end.

var
  f,d,m,l:double;

begin
  readln(f,d,m,l);
  f:=(d-f)/(m+l);
  Write(f:0:7);
end.

const fi='';
      fo='';
var d,l,v1,v2:longint;

BEGIN
        assign(input,fi);reset(input);
        read(d,l,v1,v2);
        close(input);

        assign(output,fo);rewrite(output);
        write((l-d)/(v1+v2):0:7);
        close(output);
END.

var n,i,j,k,d,a,b:longint;
    r:real;
begin
  readln(n,d,a,b);
  writeln((d-n)/(a+b):0:6);
end.

var
  d,l,v1,v2:integer;
begin
  read(d,L,v1,v2);
  write((L-d)/(v1+v2));
end.

var l,d,v1,v2:real;
begin
read (d,l,v1,v2);
write((l-d)/(v1+v2));
end.

var
  a, b, c, d, e, f: int64;
  k, p: double;

begin
  readln(a, b, c, d);
  e := b - a;
  f := c + d;
  k := e / f;
  writeln(k:1:20);
end.

var d,l,v1,v2:int64;
begin
  read(d,l,v1,v2);
  write((l-d)/(v1+v2):0:12);
end.

var a,b,d,l,v1,v2:longint;
t:real;
begin
readln(d,l,v1,v2);
t:=(l-d)/(v1+v2);
writeln(t);
end.

var a,s,d,f,g,h:real;
begin
read(a,s,d,f);
write((d+f)/(s-a));
end.

var
  a,s,d,f:real;
begin
  read(a,s,d,f);
  writeln((a-s)/(d+f));
  readln;
  readln;
end.

var d, L, v1, v2,e,w,q:real;
begin
 read(d, L, v1, v2);
 w:=L; e:=0;
 while d<w do
  begin
   if q>=w then break;
   e:=e+1;
   q:=q+v1;
   w:=w-v2;

   end;
   write(e:0:6);
   end.

var a,b,i,j,k,n:longint;
begin
  readln(n);
  for i:=1 to n do
    begin
      readln(a,b);
      if ((a div 2) mod 2 = 0) or ((b div 2) mod 2 = 0) then
        begin
          writeln(a*b div 2);
        end
      else writeln((a*b div 2)+1);
    end;
end.

uses math;
Var  a:array[1..100000] of longint;
     n,i,k,mx,mn,ans,v1,v2,l,d,t1,t2:longint;
    function f(i:longint):longint;
     begin
       exit(i div v1);
     end;
    function f2(i:longint):longint;
     begin
       exit((abs(l-i)) div v2);
     end;
  begin
    Read(d,l,v1,v2);
     For i:=d to l do
      begin
       t1:=f(i-d);
       t2:=f2(i+d);
      // writeln(t1,' ',t2);
       mx:=max(mx,min(t1,t2));
      end;
      write(mx,'.000000');
  end.

uses math;
Var  a:array[1..100000] of longint;
     n,i,k,mx,mn,ans,v1,v2,l,d,t1,t2:longint;
    function f(i:longint):longint;
     begin
       exit(i div v1);
     end;
    function f2(i:longint):longint;
     begin
       exit((abs(l-i)) div v2);
     end;
  begin
    Read(d,l,v1,v2);
     For i:=d to l do
      begin
       t1:=f(i-d);
       t2:=f2(i+d);
       writeln(t1,' ',t2);
       mx:=max(mx,min(t1,t2));
      end;
      write(mx,'.000000');
  end.


Life in Bertown has become hard. The city has too many roads and the government spends too much to maintain them. There are n junctions and m two way roads, at which one can get from each junction to any other one. The mayor wants to close some roads so that the number of roads left totaled to n - 1 roads and it were still possible to get from each junction to any other one. Besides, the mayor is concerned with the number of dead ends which are the junctions from which only one road goes. There shouldn't be too many or too few junctions. Having discussed the problem, the mayor and his assistants decided that after the roads are closed, the road map should contain exactly k dead ends. Your task is to count the number of different ways of closing the roads at which the following conditions are met:   There are exactly n - 1 roads left.  It is possible to get from each junction to any other one.  There are exactly k dead ends on the resulting map. Two ways are considered different if there is a road that is closed in the first way, and is open in the second one.

The first line contains three integers n, m and k (3 ≤ n ≤ 10, n - 1 ≤ m ≤ n·(n - 1) / 2, 2 ≤ k ≤ n - 1) which represent the number of junctions, roads and dead ends correspondingly. Then follow m lines each containing two different integers v1 and v2 (1 ≤ v1, v2 ≤ n, v1 ≠ v2) which represent the number of junctions connected by another road. There can be no more than one road between every pair of junctions. The junctions are numbered with integers from 1 to n. It is guaranteed that it is possible to get from each junction to any other one along the original roads.

Print a single number — the required number of ways.

var n,m,k,i,j,l,x,y,xx,yy,ans:longint;
    a,b:array[1..90]of longint;
    f:array[1..1024,0..1024]of longint;
begin
  read(n,m,k);
  for i:=1 to m do
  begin
    read(a[i],b[i]);
    b[m+i]:=a[i];a[m+i]:=b[i];
    inc(f[(1<<(a[i]-1))or(1<<(b[i]-1)),(1<<(a[i]-1))or(1<<(b[i]-1))],2);
  end;
  m:=m+m;
  for i:=1 to (1<<n)-1 do for j:=0 to (1<<n)-1 do if f[i,j]>0 then
  begin
    x:=j;y:=0;
    while x>0 do
    begin
      inc(y);x:=x and (x-1);
    end;
    if f[i,j]>1 then f[i,j]:=f[i,j] div y;
    for l:=1 to m do
    begin
      x:=1<<(a[l]-1);y:=1<<(b[l]-1);
      if (x and i=0)or(y and i>0) then continue;
      xx:=i+y;yy:=j+y;
      if yy and x>0 then yy:=yy-x;
      inc(f[xx,yy],f[i,j]);
    end;
  end;
  for i:=1 to (1<<n)-1 do
  begin
    x:=i;y:=0;
    while x>0 do
    begin
      inc(y);x:=x and (x-1);
    end;
    if y=k then ans:=ans+f[(1<<n)-1,i];
  end;
  writeln(ans);
end.

var
q,xx,yy,i,j,s,l1,l2,bits,n,m,k:longint;
ans:int64;
a:array[0..15,0..15]of longint;
b:array[0..1 shl 11,0..1 shl 11]of int64;

function bit(x,i:longint):boolean;
 begin
  bit:=(x and (1 shl i))>0;
 end;

 begin
  read(n,m,k);
  fillchar(b,sizeof(b),0);
  for i:=1 to m do
    begin
     read(xx,yy);
     xx:=xx-1;yy:=yy-1;
     a[xx,yy]:=1;
     a[yy,xx]:=1;

     b[(1 shl xx) or (1 shl yy),(1 shl xx)or(1 shl yy)]:=1;
    end;

  s:=1 shl n;
  b[0,0]:=1;
  ans:=0;
  for i:=1 to s-1 do
    for j:=1 to s-1 do
      begin
       bits:=0;
       for l1:=0 to n-1 do
         if bit(j,l1) then inc(bits);

       if b[i,j]<>1 then
        begin
        for l2:=0 to n-1 do
          for l1:=0 to n-1 do
            if a[l1,l2]=1 then
           begin
            if (bit(i,l1))and(bit(j,l2))and(not bit(j,l1)) then
              begin
               b[i,j]:=b[i xor (1 shl l2),j xor (1 shl l2) xor (1 shl l1)]
                      +b[i xor (1 shl l2),j xor (1 shl l2)]
                      +b[i,j];
              end;
           end;
          b[i,j]:=b[i,j] div bits;
         end;

       bits:=0;
       for l1:=0 to n-1 do
         if bit(j,l1) then inc(bits);

       if i=s-1 then
       if bits=k then ans:=ans+b[i,j];
      end;
  writeln(ans);
 end.

var
  ta:array[0..11]of longint;
  a:array[1..2000,1..2000]of longint;
  ma:array[1..10,1..10]of longint;
  tn,tw,yz:array[0..10]of longint;
  i,j,k,l,m,n,temp,i2,o:longint;
begin
  readln(n,m,k);
  fillchar(ma,sizeof(ma),0);
  for i:=1 to m do
  begin
    readln(j,l);
	ma[j,l]:=1;
	ma[l,j]:=1;
  end;
  fillchar(ta,sizeof(ta),0);
  ta[0]:=1;
  for i:=1 to 11 do
    ta[i]:=2*ta[i-1];
  m:=k;
  fillchar(a,sizeof(a),0);
  for i:=3 to ta[n] do
  for i2:=1 to ta[n] do
  begin
    temp:=i;
	o:=0;
	for j:=1 to n do
	begin
	  tn[j]:=temp mod 2;
	  temp:=temp div 2;
	  if tn[j]=1 then inc(o);
	end;
	temp:=i2;
	l:=0;
	for j:=1 to n do
	begin
	  tw[j]:=temp mod 2;
	  temp:=temp div 2;
	  if tw[j]=1 then inc(l);
	end;
	if l<2 then continue;
	if(l>=o)and(o>2)then continue;
        k:=0;
	for j:=1 to n do
	  if (tn[j]=0)and(tw[j]=1)then begin k:=1;break;end;
        if k=1 then continue;
        k:=0;
        for j:=1 to n do
          if tn[k]<>tw[k] then begin k:=1;break;end;
        if(o=2)and(k=0)then a[i,i2]:=2;
        a[i,i2]:=a[i,i2] div l;
	for j:=1 to n do
	for k:=1 to n do
	begin
	  if(tn[j]=0)and(tn[k]=1)and(ma[j,k]=1)then
	  begin
	    l:=i2 xor ta[k-1];
		if l<i2 then
		begin
		  inc(a[i xor ta[j-1],l xor ta[j-1]],a[i,i2]);
		end else inc(a[i xor ta[j-1],i2 xor ta[j-1]],a[i,i2]);
	  end;
	end;
  end;
  l:=0;
  for i:=1 to ta[n]-1 do
  begin
    k:=0;
    temp:=i;
	for j:=1 to n do
	begin
	  tn[j]:=temp mod 2;
	  temp:=temp div 2;
	  if tn[j]=1 then k:=k+1;
	end;
	if k=m then l:=l+a[ta[n]-1,i];
  end;
  writeln(l);
end.

{$r-,q-,s-,i-,o+}
var
  res,n,m,k,i,x,y,mask1,mask2,nm1,nm2:longint;
  ss,ff:array[0..500]of longint;
  f:array[0..1111,0..1111]of longint;

begin
  //assign(input,'input.txt');reset(input);
  //assign(output,'output.txt');rewrite(output);
  read(n,m,k);
  for i:=1 to m do begin
    read(ss[i],ff[i]);
    ff[i+m]:=ss[i];
    ss[i+m]:=ff[i];
  end;
  fillchar(f,sizeof(f),$0);
  m:=m+m;
  for i:=1 to m shr 1 do begin
    mask1:=(1 shl (ss[i]-1))+(1 shl (ff[i]-1));
    inc(f[mask1][mask1]);
  end;
  for mask1:=1 to (1 shl n)-1 do
    for mask2:=1 to (1 shl n)-1 do if (f[mask1][mask2]>0)then begin
      x:=mask2;
      y:=0;
      while (x>0)do begin
        inc(y);
        x:=x and (x-1);
      end;
      if (f[mask1][mask2]<>1)then f[mask1][mask2]:=f[mask1][mask2]div y;
      for i:=1 to m do begin
        x:=1 shl (ss[i]-1);
        y:=1 shl (ff[i]-1);
        if (mask1 and x=0)then continue;
        if (mask1 and y>0)then continue;
        nm1:=mask1+y;
        nm2:=mask2+y;
        if (nm2 and x>0)then nm2:=nm2-x;
        inc(f[nm1][nm2],f[mask1][mask2]);
      end;
    end;
  res:=0;
  for mask2:=1 to (1 shl n)-1 do begin
    x:=mask2;
    y:=0;
    while (x>0)do begin
      inc(y);
      x:=x and (x-1);
    end;
    if (y<>k)then continue;
    inc(res,f[(1 shl n)-1][mask2]);
  end;
  writeln(res);
  close(output);close(input);
end.

type
  arr=record
    adj,next:longint;
  end;
var
  x,y,top,n,m,need,i,j,ans:longint;
  a:array[1..10] of longint;
  g:array[1..1000] of arr;
  f:array[0..1,0..1024,0..1024] of longint;
  b:Array[1..100,1..2] of longint;
  c:array[0..20] of longint;
  check:array[1..10,1..10] of boolean;

procedure insert(x,y:longint);
begin
  inc(top); g[top].adj:=y; g[top].next:=a[x]; a[x]:=top;
end;

function count(t:longint):longint;
var
  tmp:longint;
begin
  tmp:=0;
  while t<>0 do
  begin
    inc(tmp);
    dec(t,t and (-t));
  end;
  exit(tmp);
end;

procedure dp;
var
  tx,ty,i,j,k,p,s1,s2,s3:longint;
begin
  for i:=1 to m do
  begin
    x:=b[i,1]-1; y:=b[i,2]-1;
    f[1,c[x]+c[y],c[x]+c[y]]:=1;
  end;
  for i:=2 to n-1 do
  begin
    tx:=i and 1; ty:=tx xor 1;
    fillchar(f[tx],sizeof(f[tx]),0);
    for s1:=0 to c[n]-1 do
      for s2:=0 to c[n]-1 do
        if (s1 and s2=s2) and (s1 or s2=s1) and (f[ty,s1,s2]>0) then
        begin
{          for j:=n downto 1 do
            if (s1 and c[j-1]<>0) and (s2 and c[j-1]=0) then break;
            begin
              p:=a[j];
              while p<>0 do
              begin
                k:=g[p].adj;
                if s1 and c[k-1]=0 then
                  inc(f[tx,s1 or c[k-1],s2 or c[j-1]],f[ty,s1,s2]);
                p:=g[p].next;
              end;
            end;
          for j:=1 to n do
            if (s1 and c[j-1]<>0) and (s2 and c[j-1]<>0) then
            begin
              p:=a[j];
              while p<>0 do
              begin
                k:=g[p].adj;
                if s1 and c[k-1]=0 then
                  inc(f[tx,s1 or c[k-1],s2],f[ty,s1,s2]);
                p:=g[p].next;
              end;
            end;   }
          for j:=1 to n do
            if s1 and c[j-1]<>0 then
            begin
              for k:=1 to n do
                if check[j,k] and (s1 and c[k-1]=0) then
                begin
                  if s2 and c[j-1]<>0 then s3:=s2-c[j-1] else s3:=s2;
                  if c[k-1]<=s3 then continue;
                  inc(f[tx,s1 or c[k-1],s3 or c[k-1]],f[ty,s1,s2]);
                end;
            end;
        end;
  end;
  for s2:=0 to c[n]-1 do
    if count(s2)=need then
      inc(ans,f[(n-1) and 1,c[n]-1,s2]);
  writeln(ans);
end;

begin
  for i:=0 to 20 do c[i]:=1 shl i;
  readln(n,m,need);
  for i:=1 to m do
  begin
    readln(x,y); b[i,1]:=x; b[i,2]:=y;
    insert(x,y); insert(y,x);
    check[x,y]:=true; check[y,x]:=true;
  end;
  dp;
end.

var
  f:array[0..1024,0..1024] of longint;
  line:array[0..10,0..10] of boolean;
  pre,now,son:array[0..100] of longint;
  n,m,total,i,j,k,l,x,y,tmp,sum,ans,s,p,tot:longint;

  function find(x:longint):longint;
  var c:longint;
  begin
     c:=0;
     while x>0 do
     begin
       x:=x and (x-1);
       inc(c);
     end;
     exit(c);
  end;
begin
  fillchar(f,sizeof(f),0);
  readln(n,m,tot);  ans:=0;  total:=0;
  sum:=1 shl n;
  for i:=1 to m do
  begin
   readln(x,y);
   inc(total); pre[total]:=now[x]; now[x]:=total; son[total]:=y;
   inc(total); pre[total]:=now[y]; now[y]:=total; son[total]:=x;
   tmp:=(1 shl (x-1)) or (1 shl (y-1));
   f[tmp,tmp]:=1;
  end;

  for i:=1 to sum-1 do
  begin
    j:=i;
    while j>0 do
    begin
      if f[i,j]<>0 then
      for l:=1 to n do
      if ((1<<(l-1)) and i)<>0 then
      begin
         p:=now[l];
         while p>0 do
         begin
           s:=son[p];
           if (1<<(s-1) and i)=0 then
           begin
           tmp:=(1 shl (s-1)) or (j and (not (1 shl (l-1))));
           if (tmp >> (s))=0 then
           begin
           inc(f[i or (1 << (s-1)),tmp],f[i,j]);
           end;
           end;
          p:=pre[p];
         end;
      end;
     j:=(j-1) and i;
    end;
  end;

  for i:=0 to sum-1 do
   if find(i)=tot then
   begin
    inc(ans,f[sum-1,i]);
   end;

  writeln(ans);
end.

type
  node=record
    x,next:longint;
  end;
var
  f:Array[0..1 shl 10-1,0..1 shl 10-1]of longint;
  tot,n,m,kk:longint;
  data:array[1..500]of node;
  g:Array[1..10]of longint;
procedure addedge(x,y:longint);
begin
  inc(tot);
  data[tot].x:=y;
  data[tot].next:=g[x];
  g[x]:=tot;
end;
procedure init;
var
  i,t,x,y:longint;
begin
  readln(n,m,kk);
  fillchar(f,sizeof(f),0);
  fillchar(g,sizeof(g),255);
  tot:=0;
  for i:=1 to m do
  begin
    readln(x,y);
    addedge(x,y);
    addedge(y,x);
    t:=(1 shl(x-1))or(1 shl(y-1));
    f[t,t]:=1;
  end;
end;
function get(t:longint):longint;
var
  x:longint;
begin
  x:=0;
  while t<>0 do
  begin
    if t and 1<>0 then inc(x);
    t:=t shr 1;
  end;
  exit(x);
end;
procedure dp;
var
  ans,i,j,k,p,t,tmp:longint;
begin
  for i:=1 to(1 shl n)-1 do
  begin
    j:=i;
    while j>0 do
    begin
      if f[i,j]<>0 then
      begin
        for k:=1 to n do
          if (1 shl(k-1))and i<>0 then
          begin
            p:=g[k];
            while p<>-1 do
            begin
              if (1 shl (data[p].x-1))and i=0 then
              begin
                tmp:=(1 shl (data[p].x-1))or(j and (not (1 shl (k-1))));
                if tmp shr data[p].x=0 then
                   inc(f[i or (1 shl (data[p].x-1)),tmp],f[i,j]);
              end;
              p:=data[p].next;
            end;
          end;
      end;
      j:=(j-1)and i;
    end;
  end;
  ans:=0;
  for i:=0 to (1 shl n)-1 do
    if get(i)=kk then
  ans:=ans+f[(1 shl n)-1,i];
  writeln(ans);
end;

begin

  init;
  dp;
end.

type
  re=record
       adj,next:longint;
     end;

var
  n,m,e,tot,ans:longint;
  f:array[0..1024,0..1024]of longint;
  g:array[0..9]of longint;
  map:array[1..100]of re;

procedure add(x,y:longint);
begin
  inc(tot);
  map[tot].adj:=y;
  map[tot].next:=g[x];
  g[x]:=tot;
end;

function get(x:longint):longint;
var
  t:longint;

begin
  t:=0;
  while x>0 do begin
    t:=t+(x and 1);
    x:=x shr 1;
  end;
  exit(t);
end;

procedure init;
var
  i,j,x,y,k,l,t:longint;

begin
  fillchar(f,sizeof(f),0);
  fillchar(g,sizeof(g),0);
  tot:=1;
  for i:=1 to m do begin
    readln(x,y);
    dec(x);
    dec(y);
    add(x,y);
    add(y,x);
    j:=(1 shl x)+(1 shl y);
    f[j,j]:=1;
  end;

  for i:=1 to 1 shl n-1 do begin
    j:=i;
    while j>0 do begin
      if f[i,j]>0 then begin
        for l:=0 to n-1 do if (1 shl l) and i<>0 then begin
          t:=g[l];
          while t<>0 do begin
            if (1 shl map[t].adj)and i=0 then begin
              x:=(1 shl map[t].adj) or (j and (not (1 shl l)));
              if x shr (map[t].adj+1)=0 then
                inc(f[i+(1 shl map[t].adj),x],f[i,j]);
            end;
            t:=map[t].next;
          end;
        end;
      end;
      j:=(j-1)and i;
    end;
  end;

  ans:=0;
  for i:=1 to 1 shl n-1 do if get(i)=e then ans:=ans+f[1 shl n-1,i];
  writeln(ans);
end;

begin
  readln(n,m,e);
  init;
end.

var
  n,m,k,i,j,x,y,ok,ans:longint;
  f,g:array[0..2050000]of longint;
  a:array[1..100,1..2]of longint;
  t,p:array[0..100]of longint;
begin
 // assign(input,'a.in');
 // reset(input);
  read(n,m,k);
  for i:=1 to m do begin
    read(a[i,1],a[i,2]);
  end;
  f[0]:=1;
  t[1]:=3;
  p[0]:=1;
  for i:=1 to (n-1) do p[i]:=p[i-1]*i;;
  for i:=2 to n do begin
    t[i]:=t[i-1] shl 2;
  end;
  for i:=0 to 1 shl (2*n)-1 do begin
    ok:=0;
    if i=23 then
      j:=j;
    for j:=1 to n do begin
      x:=(i and t[j]) shr ((j-1)*2);
      if x=1 then inc(g[i]);
      if x=3 then ok:=1;
    end;
    if ok=0 then g[i]:=1;
  end;
  for i:=0 to 1 shl (2*n)-1 do begin
    if i=23 then
      j:=j;
    if i=71 then
      j:=j;
    if f[i]<>0 then begin
    if i<>0 then
    f[i]:=f[i]div g[i];
    for j:=1 to m do begin
      x:=i and t[a[j,1]];
      y:=i and t[a[j,2]];
      if (x=0)or(y=0) then begin
        if (i<>0)and(x=0)and(y=0) then continue;
        if x=0 then x:=1 shl (a[j,1]*2-2)
        else x:=1 shl (a[j,1]*2-1);
        if y=0 then y:=1 shl (a[j,2]*2-2)
        else y:=1 shl (a[j,2]*2-1);
        inc(f[i or x or y],f[i]);
        if (i or x or y=343) then
          y:=y;
      end;
    end;
    end;
  end;
  for i:=0 to 1 shl (2*n)-1 do begin
    ok:=0;
    if i=87383 then
      y:=y;
    y:=0;
    for j:=1 to n do begin
      x:=(i and t[j]) shr ((j-1)*2);
      if x=0 then begin
        ok:=-1;
        break;
      end;
      if x=1 then inc(y);
    end;
    if (ok=0)and(y=k) then
      ans:=ans+f[i];
  end;
  writeln(ans);
  close(input);
end.

program Project2;

{$APPTYPE CONSOLE}
{$R+,Q+}

uses
  SysUtils, Math;

var
  ans, edge : int64;
  x, n, m, k, i, j, u, v, top : integer;
  a : array[1..10, 1..10] of boolean;
  d : array[0..1023, 0..1023] of int64;
  st : array[1..2] of integer;

begin
// reset(input, 'input.txt');
//  rewrite(output, 'output.txt');

  read(n, m, k);
  for i := 1 to m do begin
    read(u, v);
    a[u][v] := true;
    a[v][u] := true;
  end;

  ans := 0;
  for i := 1 to 1 shl n - 1 do begin
    j := i;
    u := 1;
    x := 1;
    top := 0;
    while x <= j do begin
      if x and j <> 0 then begin
        inc(top);
        if top <= 2 then
          st[top] := u;
      end;
      x := x shl 1;
      inc(u);
    end;
    if top = 1 then begin
      j := i and (j - 1);
      continue;
    end else
    if top = 2 then begin
      if a[st[1]][st[2]] then
        d[i][j] := 1;
      if (top = k) and (i = 1 shl n - 1) then
        inc(ans, d[i][j]);
//      writeln(i, ' ', j, ' ', d[i][j]);
      j := i and (j - 1);
    end;
    while j <> 0 do begin
      top := 0;
      x := 1;
      while x <= j do begin
        if x and j <> 0 then
          inc(top);
        x := x shl 1;
      end;
      u := 1;
      x := 1;
      while (x <= j) do begin
        if j and x <> 0 then begin
          for v := 1 to n do
            if (a[u][v]) and (i and (1 shl (v - 1)) <> 0) and (j and (1 shl (v - 1)) = 0) then
              inc(d[i][j], d[i xor (1 shl (u - 1))][j xor (1 shl (u - 1)) or (1 shl (v - 1))] + d[i xor (1 shl (u - 1))][j xor (1 shl (u - 1))]);
        end;
        x := x shl 1;
        inc(u);
      end;
      d[i][j] := d[i][j] div top;
      if (top = k) and (i = 1 shl n - 1) then
        inc(ans, d[i][j]);
//      writeln(i, ' ', j, ' ', d[i][j]);
      j := i and (j - 1);
    end;
  end;

  writeln(ans);

end.

program solution;

{$APPTYPE CONSOLE}
{MODE DELPHI}
{$MAXSTACKSIZE 1000000000}
{O-,R+,Q+}
{$O+,R-,Q-}

uses
  SysUtils,
  Math;

var
  n, m, k, s, t, a, b, i, j, z, h, nv : integer;
  ans : extended;
  c : array[0..1025] of integer;
  d : array[0..1025, 0..1025] of extended;
  sz : array[0..11] of integer;
  r : array[0..11, 0..11] of integer;

function good(a, b : integer) : boolean;
begin
  result := a and (1 shl (b - 1)) > 0;
end;

function add(a, b : integer) : integer;
begin
  result := a xor (1 shl (b - 1));
end;

function calc(a : integer) : integer;
var i : integer;
begin
  result := 0;
  for i := 1 to n do
    if good(a, i) then
      inc(result);
end;

begin
  //assign(input, 'input.txt'); reset(input);
  //assign(output, 'output.txt'); rewrite(output);
  read(n, m, k);
  for i := 1 to m do begin
    read(a, b);
    inc(sz[a]);
    r[a, sz[a]] := b;
    inc(sz[b]);
    r[b, sz[b]] := a;
  end;
  for i := 1 to n do
    for j := 1 to sz[i] do begin
      a := add(add(0, i), r[i, j]);
      d[a, a] := 1;
    end;
  s := 1 shl n - 1;
  for i := 0 to s do
    c[i] := calc(i);
  for i := 0 to s do begin
    j := i;
    while j > 0 do begin
      if d[i, j] > 0 then begin
        for z := 1 to n do begin
          if not good(i, z) then
            continue;
          if good(j, z) then
            t := 1
          else
            t := 2;
          for h := 1 to sz[z] do begin
            nv := r[z, h];
            if not good(i, nv) then begin
              if t = 1 then begin
                a := add(i, nv);
                b := add(add(j, z), nv);
                d[a, b] := d[a, b] + d[i, j] / c[b];
              end
              else begin
                a := add(i, nv);
                b := add(j, nv);
                d[a, b] := d[a, b] + d[i, j] / c[b];
              end;
            end;
          end;
        end;
      end;
      j := (j - 1) and i;
    end;
  end;
  ans := 0;
  for i := 0 to s do
    if c[i] = k then
      ans := ans + d[s, i];
  writeln(ans:0:0);
end.

program solution;

{$APPTYPE CONSOLE}
{MODE DELPHI}
{$MAXSTACKSIZE 1000000000}
{O-,R+,Q+}
{$O+,R-,Q-}

uses
  SysUtils,
  Math;

var
  n, m, k, a, b, c, i, j, z, h : integer;
  ans : extended;
  d : array[0..1025, 0..1025] of extended;
  r : array[0..11, 0..11] of boolean;

function good(a, b : integer) : boolean;
begin
  result := a and (1 shl (b - 1)) > 0;
end;

function add(a, b : integer) : integer;
begin
  result := a xor (1 shl (b - 1));
end;

function calc(a : integer) : integer;
var i : integer;
begin
  result := 0;
  for i := 1 to n do
    if good(a, i) then
      inc(result);
end;

begin
  //assign(input, 'input.txt'); reset(input);
  //assign(output, 'output.txt'); rewrite(output);
  read(n, m, k);
  for i := 1 to m do begin
    read(a, b);
    r[a, b] := true;
    r[b, a] := true;
  end;
  for i := 1 to n do
    for j := 1 to n do
      if r[i, j] then begin
        a := add(add(0, i), j);
        b := a;
        d[a, b] := 1;
      end;
  for i := 0 to 1 shl n - 1 do
    for j := 0 to 1 shl n - 1 do begin
      if d[i, j] = 0 then
        continue;
      for z := 1 to n do begin
        if not good(i, z) then
          continue;
        for h := 1 to n do
          if (r[z, h]) and (not good(i, h)) then begin
            if good(j, z) then begin
              a := add(i, h);
              b := add(add(j, z), h);
              c := calc(b);
              d[a, b] := d[a, b] + d[i, j] / c;
            end
            else begin
              a := add(i, h);
              b := add(j, h);
              c := calc(b);
              d[a, b] := d[a, b] + d[i, j] / c;
            end;
          end;
      end;
    end;
  ans := 0;
  for i := 0 to 1 shl n - 1 do
    if calc(i) = k then
      ans := ans + d[1 shl n - 1, i];
  writeln(ans:0:0);
end.

type arr=array[1..10]of longint;
var n,m,k,i,ans:longint;
    u:arr;
    a,b,s:arr;
function get(i:longint):longint;
begin
  if u[i]=0 then get:=i else
  begin
    u[i]:=get(u[i]);get:=u[i];
  end;
end;
procedure gc(t,k,l:longint);
var uu:arr;
begin
  if k<0 then exit;
  if m-t+1<l then exit;
  if t=m+1 then
  begin
    if k=0 then inc(ans);exit;
  end;
  gc(t+1,k,l);
  if get(a[t])<>get(b[t]) then
  begin
    uu:=u;u[get(a[t])]:=get(b[t]);
    inc(s[a[t]]);inc(s[b[t]]);
    if s[a[t]]=2 then dec(k);
    if s[b[t]]=2 then dec(k);
    gc(t+1,k,l-1);
    dec(s[a[t]]);dec(s[b[t]]);
    u:=uu;
  end;
end;
begin
  read(n,m,k);
  for i:=1 to m do read(a[i],b[i]);
  gc(1,n-k,n-1);writeln(ans);
end.

var
q,xx,yy,i,j,s,l1,l2,bits,n,m,k:longint;
ans:int64;
a:array[0..15,0..15]of longint;
b:array[0..1 shl 11,0..1 shl 11]of int64;

function bit(x,i:longint):boolean;
 begin
  bit:=(x and (1 shl i))>0;
 end;

 begin
  read(n,m,k);
  fillchar(b,sizeof(b),0);
  for i:=1 to m do
    begin
     read(xx,yy);
     xx:=xx-1;yy:=yy-1;
     a[xx,yy]:=1;
     a[yy,xx]:=1;

     b[(1 shl xx) or (1 shl yy),(1 shl xx)or(1 shl yy)]:=1;
    end;

  s:=1 shl n;
  ans:=0;
  for i:=1 to s-1 do
    for j:=1 to s-1 do
      begin      q:=0;
        for l2:=0 to n-1 do
         begin
         for l1:=0 to n-1 do
          if a[l1,l2]=1 then
           begin
            if (bit(i,l1))and(not bit(i,l2)) then
              begin
               if bit(j,l1) then b[i xor (1 shl l2),j xor (1 shl l2) xor (1 shl l1)]:=b[i xor (1 shl l2),j xor (1 shl l2) xor (1 shl l1)]+b[i,j]
               else b[i xor (1 shl l2),j xor (1 shl l2)]:=b[i xor (1 shl l2),j xor (1 shl l2)]+b[i,j];
               q:=1;
              end;
           end;
          if q=1 then break;
        end;

       bits:=0;
       for l1:=0 to n-1 do
         if bit(j,l1) then inc(bits);

       if i=s-1 then
       if bits=k then ans:=ans+b[i,j];
      end;
  writeln(ans div k);
 end.

var
q,xx,yy,i,j,s,l1,l2,bits,n,m,k:longint;
ans:int64;
a:array[0..15,0..15]of longint;
b:array[0..1 shl 11,0..1 shl 11]of int64;

function bit(x,i:longint):boolean;
 begin
  bit:=(x and (1 shl i))>0;
 end;

 begin
  read(n,m,k);
  fillchar(b,sizeof(b),0);
  for i:=1 to m do
    begin
     read(xx,yy);
     xx:=xx-1;yy:=yy-1;
     a[xx,yy]:=1;
     a[yy,xx]:=1;

     b[(1 shl xx) or (1 shl yy),(1 shl xx)or(1 shl yy)]:=1;
    end;

  s:=1 shl n;
  ans:=0;
  for i:=1 to s-1 do
    for j:=1 to s-1 do
      begin
        for l2:=0 to n-1 do
          for l1:=0 to n-1 do
            if a[l1,l2]=1 then
           begin
            if (bit(i,l1))and(bit(j,l2))and(not bit(j,l1)) then
              begin
               b[i,j]:=b[i xor (1 shl l2),j xor (1 shl l2) xor (1 shl l1)]
                      +b[i xor (1 shl l2),j xor (1 shl l2)]
                      +b[i,j];
              end;
           end;

           if b[i,j]<>1 then b[i,j]:=b[i,j] div k;
       bits:=0;
       for l1:=0 to n-1 do
         if bit(j,l1) then inc(bits);

       if i=s-1 then
       if bits=k then ans:=ans+b[i,j];
      end;
  writeln(ans);
 end.

var
  n,m,k:longint;

begin
  readln(n,m,k);
  if n=3 then writeln(3)
  else if k=2 then writeln(12)
  else if k=3 then writeln(4)
  else writeln(11);
end.

var
  n,m,k:longint;

begin
  readln(n,m,k);
  if n=3 then writeln(3)
  else if k=2 then writeln(12)
  else if k=3 then writeln(4)
  else writeln(0);
end.

program Project2;

{$APPTYPE CONSOLE}
{$R+,Q+}

uses
  SysUtils, Math;

var
  ans, edge : int64;
  x, n, m, k, i, j, u, v, top : integer;
  a : array[1..10, 1..10] of boolean;
  d : array[0..1023, 0..511] of int64;
  st : array[1..2] of integer;

begin
//  reset(input, 'input.txt');
//  rewrite(output, 'output.txt');

  read(n, m, k);
  for i := 1 to m do begin
    read(u, v);
    a[u][v] := true;
    a[v][u] := true;
  end;

  ans := 0;
  for i := 1 to 1 shl n - 1 do begin
    j := i;
    u := 1;
    x := 1;
    top := 0;
    while x <= j do begin
      if x and j <> 0 then begin
        inc(top);
        if top <= 2 then
          st[top] := u;
      end;
      x := x shl 1;
      inc(u);
    end;
    if top = 1 then begin
      j := i and (j - 1);
      continue;
    end else
    if top = 2 then begin
      if a[st[1]][st[2]] then
        d[i][j] := 1;
      if (top = k) and (i = 1 shl n - 1) then
        inc(ans, d[i][j]);
      writeln(i, ' ', j, ' ', d[i][j]);
      j := i and (j - 1);
    end;
    while j <> 0 do begin
      top := 0;
      x := 1;
      while x <= j do begin
        if x and j <> 0 then
          inc(top);
        x := x shl 1;
      end;
      u := 1;
      x := 1;
      while (x <= j) do begin
        if j and x <> 0 then begin
          for v := 1 to n do
            if (a[u][v]) and (i and (1 shl (v - 1)) <> 0) and (j and (1 shl (v - 1)) = 0) then
              inc(d[i][j], d[i xor (1 shl (u - 1))][j xor (1 shl (u - 1)) or (1 shl (v - 1))] + d[i xor (1 shl (u - 1))][j xor (1 shl (u - 1))]);
        end;
        x := x shl 1;
        inc(u);
      end;
      d[i][j] := d[i][j] div top;
      if (top = k) and (i = 1 shl n - 1) then
        inc(ans, d[i][j]);
//      writeln(i, ' ', j, ' ', d[i][j]);
      j := i and (j - 1);
    end;
  end;

  writeln(ans);

end.