#include<cstdio>
#include<queue>
using namespace std;
const long long INF=2147483647ll*100000000;
long long dis[1010][1010][2],A[1010],B[1010],ans;
int head[1010],to[20010],size[20010],nxt[20010],num,n,m,S,T,k,x,y,z;
bool tag[1010],in[1010][1010],flag;
struct queue_data
{
	int p,edgenum;
};
queue<queue_data> q;
void add(int x,int y,int z)
{
	nxt[++num]=head[x];
	to[head[x]=num]=y;
	size[num]=z;
}
void SPFA1()
{
	for(int i=1;i<=n;i++)
	for(int j=0;j<=n;j++)
	dis[i][j][0]=dis[i][j][1]=INF;
	dis[S][0][0]=0;
	q.push((queue_data){S,0});
	in[S][0]=1;
	for(;!q.empty();)
	{
		queue_data u=q.front();
		q.pop();
		in[u.p][u.edgenum]=0;
		if(u.edgenum==n)continue;
		for(int i=head[u.p];i;i=nxt[i])
		if(tag[to[i]])
		{
			if(dis[u.p][u.edgenum][0]+size[i]<dis[to[i]][u.edgenum+1][0])
			{
				dis[to[i]][u.edgenum+1][0]=dis[u.p][u.edgenum][0]+size[i];
				if(!in[to[i]][u.edgenum+1])
				{
					q.push((queue_data){to[i],u.edgenum+1});
					in[to[i]][u.edgenum+1]=1;
				}
			}
		}
	}
	for(int i=1;i<=n;i++)A[i]=dis[T][i][0];
}
void SPFA2()
{
	for(int i=1;i<=n;i++)
	for(int j=0;j<=n;j++)
	dis[i][j][0]=dis[i][j][1]=INF;
	dis[S][0][0]=0;
	q.push((queue_data){S,0});
	in[S][0]=1;
	for(;!q.empty();)
	{
		queue_data u=q.front();
		q.pop();
		in[u.p][u.edgenum]=0;
		if(u.edgenum==n)continue;
		for(int i=head[u.p];i;i=nxt[i])
		if(tag[to[i]])
		{
			for(int k=0;k<2;k++)
			if(dis[u.p][u.edgenum][k]+size[i]<dis[to[i]][u.edgenum+1][k])
			{
				dis[to[i]][u.edgenum+1][k]=dis[u.p][u.edgenum][k]+size[i];
				if(!in[to[i]][u.edgenum+1])
				{
					q.push((queue_data){to[i],u.edgenum+1});
					in[to[i]][u.edgenum+1]=1;
				}
			}
		}
		else
		{
			for(int k=0;k<2;k++)
			for(int k2=0;k2<2;k2++)
			if(dis[u.p][u.edgenum][k]+size[i]<dis[to[i]][u.edgenum+1][k2])
			{
				dis[to[i]][u.edgenum+1][k2]=dis[u.p][u.edgenum][k]+size[i];
				if(!in[to[i]][u.edgenum+1])
				{
					q.push((queue_data){to[i],u.edgenum+1});
					in[to[i]][u.edgenum+1]=1;
				}
			}
		}
	}
	for(int i=1;i<=n;i++)B[i]=dis[T][i][1];
}
int main()
{
	scanf("%d%d%d%d",&n,&m,&S,&T);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	scanf("%d",&k);
	for(int i=1;i<=k;i++)
	{
		scanf("%d",&x);
		tag[x]=1;
	}
	SPFA1();
	SPFA2();
	flag=1;
	for(int i=1;i<=n;i++)
	if(A[i]>=B[i])
	{
		flag=0;
		break;
	}
	if(flag)
	{
		printf("Infinity\n");
		return 0;
	}
	for(int i=1;i<=n;i++)
	if(A[i]<B[i]&&A[i]!=INF)
	{
		long long tans=INF;
		for(int j=1;j<i;j++)
		if(B[j]!=INF)
		tans=min((B[j]-A[i]-1)/(i-j),tans);
		if(tans==INF)
		{
			printf("Infinity\n");
			return 0;
		}
		flag=1;
		for(int j=i+1;j<=n;j++)
		if(B[j]!=INF&&A[i]+i*tans>=B[j]+j*tans)
		{
			flag=0;
			break;
		}
		if(flag)ans=max(ans,tans);
	}
	if(ans>0)printf("%lld\n",ans);
	else printf("Impossible\n");
	return 0;
}
