#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define max 1000
typedef struct edge
{
    int to;
    int weight;
    struct edge*next;
}edge;
edge*graph[max];
int dist[max],inqueue[max];
int queue[max*10];
int front =0,rear=0;
void addedge(int u,int v,int w)
{
    edge*newedge=(edge*)malloc(sizeof(edge));
    newedge->to=v;
    newedge->weight=w;
    newedge->next=graph[u];
    graph[u]=newedge;
}
void enqueue(int x)
{
    queue[rear++]=x;
}
int dequeue()
{
    return queue[front++];
}
int isempty()
{
    return front==rear;
}

   void SPFA(int n,int s)
   {
       for(int i=1;i<=n;i++)
       {
           dist[i]=INT_MAX;
           inqueue[i]=0;
       }
       dist[s]=0;
       enqueue(s);
       inqueue[s]=1;
       while(!isempty())
       {
           int u=dequeue();
           inqueue[u]=0;
           for(edge*e=graph[u];e!=NULL;e=e->next)
           {
       int v=e->to;
       int w=e->weight;
       if(dist[u]!=INT_MAX &&dist[u]+w<dist[v])
       {
           dist[v]=dist[u]+w;
           if(!inqueue[v])
           {
               enqueue(v);
               inqueue[v]=1;
           }
       }
           }
       }
   }  
 int main()
 {
     int n,m;
     scanf("%d",&n);
     if(n<=0)
     {
         printf("Ivalid input\n");
         return 0;
     }
     scanf("%d",&m);
     if(m<0)
     {
         printf("Invalid input\n");
         return 0;
     }
     for(int i=0;i<m;i++)
     {
         int u,v,m;
         scanf("%d %d %d",&u,&v,&w);
         addedge(u,v,w);
     }
     int S,D;
     scanf("%d %d",&S,&D);
     SPFA(N,S);
     if(dist[d]==INT_MAX)
     printf(".1\n");
     else
     printf("%d\n",dist[d]);
     return 0;
 }