先把边按边权从大到小排,O(M^2)枚举边的区间,并查集判断S和T是否连通,若联通则更新答案
const int N = 510, M = 5010;
typedef pair<int, pair<int, int> > PIII;
PIII Edge[M];
int Fa[N], n, m, S, T;
int Rate1, Rate2;
inline void Input() {
scanf("%d%d", &n, &m);
For(i, 1, m) scanf("%d%d%d", &Edge[i].sd.ft, &Edge[i].sd.sd, &Edge[i].ft);
sort(Edge + 1, Edge + 1 + m);
scanf("%d%d", &S, &T);
}
inline int gcd(int A, int B) {
if(!B) return A;
else return gcd(B, A % B);
}
inline void UpDat(int A, int B) {
int Gcd;
Gcd = gcd(A, B);
A /= Gcd, B /= Gcd;
if((LL)Rate1 * B > (LL)Rate2 * A) Rate1 = A, Rate2 = B;
Gcd = gcd(Rate1, Rate2);
Rate1 /= Gcd, Rate2 /= Gcd;
}
inline int Get(int x) {
if(Fa[x] != x) return Fa[x] = Get(Fa[x]);
else return x;
}
inline void Solve() {
Rate1 = INF, Rate2 = 1;
Ford(l, m, 1) {
For(i, 1, n) Fa[i] = i;
Ford(r, l, 1) {
int u = Edge[r].sd.ft, v = Edge[r].sd.sd;
Fa[Get(u)] = Get(v);
if(Get(S) == Get(T)) {
UpDat(Edge[l].ft, Edge[r].ft);
break;
}
}
}
UpDat(INF, 1);
if(Rate2 == 1) {
if(Rate1 >= INF) puts("IMPOSSIBLE");
else printf("%d\n", Rate1);
} else printf("%d/%d\n", Rate1, Rate2);
}
int main() {
#ifndef ONLINE_JUDGE
SETIO("1050");
#endif
Input();
Solve();
return 0;
}