dinic卡死了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,t,head[211000],level[220102],tot=1,vis[200012],maxflow=0,xiao[1201],fa[1293];
int u[221123],v[210203],w[212023],edge[212023],mid,now[212002];
struct jd{
int w,v,nxt;
}a[211000];
void add(int u,int v,int w){
a[++tot].v=v;
a[tot].nxt=head[u];
a[tot].w=w;
head[u]=tot;
}
queue<int> q;
bool bfs(){
memset(level,0,sizeof(level));
while(!q.empty())q.pop();
level[1]=1;
q.push(1);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=a[i].nxt){
int y=a[i].v,z=a[i].w;
if(level[y]||!edge[i]){
continue;
}
q.push(y);
now[y]=head[y];
level[y]=level[x]+1;
if(y==n)return 1;
}
}
return 0;
}
int dfs(int u,int ll){
if(u==n)return ll;
int ans1=ll,i;
for(i=now[u];ans1&&i;i=a[i].nxt){
int y=a[i].v,z=a[i].w;
if((level[y]==level[u]+1)&&edge[i]&&z<=mid){
int zxl=dfs(y,min(ll,z));
if(!zxl){
level[y]=0;
}
edge[i]-=zxl;
edge[i^1]+=zxl;
ans1-=zxl;
}
}
now[u]=i;
return ll-ans1;
}
int dinic(){
int p;
while(bfs()){
while(p=dfs(1,1e9)){
maxflow+=p;
}
}
return maxflow;
}
signed main(){
cin>>n>>m>>t;
for(int i=1;i<=m;i++){
cin>>u[i]>>v[i]>>w[i];
add(u[i],v[i],w[i]);
add(v[i],u[i],w[i]);
}
int l=1,r=1e6+1,ans=-1;
while(l<=r){
memset(edge,1,sizeof(edge));
mid=l+r>>1;
if(dinic()>=t)r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans;
return 0;
}