20pt求调
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=2e5+10;
int n,m,a,b,v[N],trd[M][2],step[M],check[M];
vector<int> tr[M];
int main(){
cin>>n>>m>>a>>b;
a++,b++;
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&trd[i][1],&trd[i][2]);
trd[i][1]++,trd[i][2]++;
tr[trd[i][1]].push_back(trd[i][2]);
}
int sum=0,l=0,r=0,flag=0;
step[l]=a,check[a]=1;
while(l<=r){
for(int i=0;i<tr[step[l]].size();i++){
if(!check[tr[step[l]][i]]){
step[++r]=tr[step[l]][i];
check[tr[step[l]][i]]=1;
if(tr[step[l]][i]==b){
flag=1;
break;
}
}
}
l++,sum++;
if(flag==1) break;
}
if(flag) cout<<v[b]-v[a]+sum;
else cout<<"No solution";
return 0;
}