/* Vjudge
 * User : Siunaus
 * RunID : 4484225
 * OJ : UVA
 * Prob ID : 12884
 * Result : Accepted
 * Time : 652ms
 * Language : C++ 4.8.2
 * Length : 2120
 */ 

#include<bits/stdc++.h>
#define rep(i,j,k) for(i=j;i<=k;i++)
#define MAXN 1110
#define MM 8000000
using namespace std;

struct node{
	int dep,x,White;
} q[8000010];

struct _{
	int y,next;
	long long z;
} e[44000];

long long dist[2][MAXN][MAXN];
int vis[2][1100][1100];
int head,tail,i,j,n,P,m,X,Y,x,y,tot,dep,Wb;
long long z,INF,ans;
double high,low;
int g[1100];
long long g2[MAXN],f[1100];
int White[1100],Black[MAXN];

void add(int u, int v, long long w){
	tot++;
	e[tot].y=v;
	e[tot].z=w;
	e[tot].next=g[u];
	g[u]=tot;
}

int main(){
	while (scanf("%d%d%d%d",&n,&P,&X,&Y) != EOF){// Multi cases 
	tot=0;
	rep(i,1,n){
		g[i]=0;
	}
	rep(i,1,P){
		scanf("%d%d%lld",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	scanf("%d",&m);
	rep(i,1,n)
		White[i]=1;
	rep(i,1,m){
		scanf("%d",&x);
		White[x]=0;
	}
	INF=2147483647LL*10000000LL;
	rep(i,1,n)
		rep(j,1,n){	
			dist[0][i][j]=dist[1][i][j]=INF;
			vis[0][i][j]=vis[1][i][j]=0; 
		}
	rep(j,1,n){
		dist[0][n+1][j]=dist[1][n+1][j]=0;
		vis[0][n+1][j]=vis[1][n+1][j]=0;
	}
	dist[0][0][X]=0;
	q[1].dep=0;
	q[1].x=X;
	q[1].White=0;
	vis[0][0][X]=1;
	head=0;
	tail=1;
	while(head!=tail){
		head=(head+1)%MM;
		x=q[head].x;
		dep=q[head].dep;
		Wb=q[head].White;
		y=g[x];
		vis[Wb][dep][x]=0;
		while(e[y].y){
			if (dist[Wb|White[e[y].y]][dep+1][e[y].y]>dist[Wb][dep][x]+e[y].z){
				dist[Wb|White[e[y].y]][dep+1][e[y].y]=dist[Wb][dep][x]+e[y].z;
				if (!vis[Wb|White[e[y].y]][dep+1][e[y].y]){
					tail=(tail+1)%MM;
					q[tail].x=e[y].y;
					q[tail].dep=dep+1;
					q[tail].White=(Wb|White[e[y].y]);
					vis[Wb|White[e[y].y]][dep+1][e[y].y]=1;
				}
			}
			y=e[y].next;
		}
	}
	rep(i,1,n){
		g2[i]=dist[0][i][Y];
		f[i]=dist[1][i][Y];
	}
	long long ans1 = -1;
	rep(i,1,n-1){
	long long high1 = INF, low1 = 0;
		rep(j,1,i-1){
			high1 = min(high1, (f[j] - g2[i] - 1) / (i - j));
		}
		low=0;
		rep(j,i+1,n-1){
			low1 = max(low1, (g2[i] - f[j]) / (j - i) + 1);
		}
		if (g2[i]>=f[i])
			high1=-1;
		if (high1 >= low1){
			ans1=max(ans1,high1);
		}
	}
	if (ans1==-1) printf("Impossible\n");
	else if (ans1>=INF-100000) printf("Infinity\n");
	else printf("%lld\n",ans1);
	}
	return 0;
}

