#include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断
#include<stdlib.h>//枚举最大的一条边肯定要找和他的值最接近的边,所以要排序
#define N 5100
#define inf 0x3fffffff
struct node {
int u,v,speed;
}map[N];
int gcd(int a,int b) {
if(b==0)
return a;
return gcd(b,a%b);
}
int cmp(const void *a,const void *b) {
return (*(struct node *)b).speed-(*(struct node *)a).speed;
}
int pre[510];
int find(int x) {
if(x!=pre[x])
pre[x]=find(pre[x]);
return pre[x];
}
int main(){
int min,max,mi,ma,i,j,k,tt,t,n,m,s,a,b;
scanf("%d",&tt);
while(tt--) {
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)//
scanf("%d%d%d",&map[i].u,&map[i].v,&map[i].speed);
scanf("%d%d",&s,&t);
max=inf;min=1;//初始化比值为最大
qsort(map,m,sizeof(map[0]),cmp);//排序从大到小
for(i=0;i<m;i++) {
for(j=1;j<=n;j++)
pre[j]=j;
mi=inf;ma=-1;
for(j=i;j<m;j++) {
a=find(map[j].u);
b=find(map[j].v);
if(a!=b) {//如果两个点之间的路径没有加过
pre[b]=a;
if(mi>map[j].speed)//当前路中的最小值
mi=map[j].speed;
if(ma<map[j].speed)//当前路中的最大值
ma=map[j].speed;
}
if(find(s)==find(t))//当前边加入后是否可以联通s-t
break;
}
if(j==m)//如果找不到直接退出
break;
if(max*mi>min*ma) {//更新最小比值
max=ma;
min=mi;
}
}
if(max%min==inf) {//如果没有s-t的路径输出
printf("IMPOSSIBLE ");
continue;
}
if(max%min==0)
printf("%d ",max/min);
else {//如果不能整除
k=gcd(max,min);
printf("%d/%d ",max/k,min/k);
}
}
return 0;
}
#include<stdlib.h>//枚举最大的一条边肯定要找和他的值最接近的边,所以要排序
#define N 5100
#define inf 0x3fffffff
struct node {
int u,v,speed;
}map[N];
int gcd(int a,int b) {
if(b==0)
return a;
return gcd(b,a%b);
}
int cmp(const void *a,const void *b) {
return (*(struct node *)b).speed-(*(struct node *)a).speed;
}
int pre[510];
int find(int x) {
if(x!=pre[x])
pre[x]=find(pre[x]);
return pre[x];
}
int main(){
int min,max,mi,ma,i,j,k,tt,t,n,m,s,a,b;
scanf("%d",&tt);
while(tt--) {
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)//
scanf("%d%d%d",&map[i].u,&map[i].v,&map[i].speed);
scanf("%d%d",&s,&t);
max=inf;min=1;//初始化比值为最大
qsort(map,m,sizeof(map[0]),cmp);//排序从大到小
for(i=0;i<m;i++) {
for(j=1;j<=n;j++)
pre[j]=j;
mi=inf;ma=-1;
for(j=i;j<m;j++) {
a=find(map[j].u);
b=find(map[j].v);
if(a!=b) {//如果两个点之间的路径没有加过
pre[b]=a;
if(mi>map[j].speed)//当前路中的最小值
mi=map[j].speed;
if(ma<map[j].speed)//当前路中的最大值
ma=map[j].speed;
}
if(find(s)==find(t))//当前边加入后是否可以联通s-t
break;
}
if(j==m)//如果找不到直接退出
break;
if(max*mi>min*ma) {//更新最小比值
max=ma;
min=mi;
}
}
if(max%min==inf) {//如果没有s-t的路径输出
printf("IMPOSSIBLE ");
continue;
}
if(max%min==0)
printf("%d ",max/min);
else {//如果不能整除
k=gcd(max,min);
printf("%d/%d ",max/k,min/k);
}
}
return 0;
}