Z小鎮是一個景色宜人的地方,吸引來自各地的觀光客來此旅遊觀光。Z小鎮附近共有N(1<N≤500)個景點(編號爲1,2,3,…,N),這些景點被M(0<M≤5000)條道路連接着,所有道路都是雙向的,兩個景點之間可能有多條道路。也許是爲了保護該地的旅遊資源,Z小鎮有個奇怪的規定,就是對於一條給定的公路Ri,任何在該公路上行駛的車輛速度必須爲Vi。頻繁的改變速度使得遊客們很不舒服,因此大家從一個景點前往另一個景點的時候,都希望選擇行使過程中最大速度和最小速度的比儘可能小的路線,也就是所謂最舒適的路線。
輸入描述 Input Description
第一行包含兩個正整數,N和M。接下來的M行每行包含三個正整數:x,y和v(1≤x,y≤N,0 最後一行包含兩個正整數s,t,表示想知道從景點s到景點t最大最小速度比最小的路徑。s和t不可能相同。
輸出描述 Output Description
如果景點s到景點t沒有路徑,輸出“IMPOSSIBLE”。否則輸出一個數,表示最小的速度比。如果需要,輸出一個既約分數。
樣例輸入 Sample Input
樣例1
4 2
1 2 1
3 4 2
1 4
樣例2
3 31 2 10
1 2 5
2 3 8
1 3
樣例3
3 2
1 2 2
2 3 4
1 3
樣例輸出 Sample Output
樣例1
IMPOSSIBLE
樣例2
5/4
樣例3
2
代碼:
var
flag,s1,t1,s,t,n,m,i,j:longint;
f,v,x,y:array[0..50000]of longint;
function gcd(x,y:longint):longint;
begin
if x mod y=0 then exit(y);
gcd:=gcd(y,x mod y);
end;
procedure qsort(l,r:longint);
var
i,j,t:longint;
begin
i:=l;j:=r;t:=v[random(l+r-1)];
repeat
while v[i]>t do inc(i);
while v[j]<t do dec(j);
if i<=j then begin
x[0]:=x[i];x[i]:=x[j];x[j]:=x[0];
y[0]:=y[i];y[i]:=y[j];y[j]:=y[0];
v[0]:=v[i];v[i]:=v[j];v[j]:=v[0];
inc(i);dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
function father(x:longint):longint;
begin
if f[x]=x then exit(x);
f[x]:=father(f[x]);
exit(f[x]);
end;
procedure main(xx:longint);
var
i,j,k:longint;
begin
for i:=1 to n do
f[i]:=i;
for i:=xx to m do
begin
f[father(x[i])]:=father(y[i]);
if father(s)=father(t)
then begin
inc(flag);
if flag=1 then begin
s1:=v[xx];
t1:=v[i];
end;
if (v[xx]/v[i])<(s1/t1)
then begin
t1:=v[i];
s1:=v[xx];
end;
end;
end;
end;
begin
readln(n,m);
for i:=1 to m do
readln(x[i],y[i],v[i]);
qsort(1,m);
readln(s,t);
for i:=1 to m do
main(i);
if flag=0 then writeln('IMPOSSIBLE')
else if s1 mod t1=0 then writeln(s1 div t1)
else writeln(s1 div gcd(s1,t1),'/',t1 div gcd(s1,t1));
end.