#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
int const INF = 0x3f3f3f3f;
//-------------------------------------------------------
int const N = 510;
int n, m;
int map[N][N],dist[N];
bool book[N];
//-------------------------------------------------------
void init()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j) map[i][j] = 0;
else map[i][j] = INF;
}
}
}
int dijkstra()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
for (int i = 1; i <= n; i++)
{
int t = -1;
for (int j = 1; j <= n; j++)
if ((t == -1 || dist[t] > dist[j]) && !book[j]) t = j;
for (int j = 1; j <= n; j++)
dist[j] = min(dist[j], dist[t] + map[t][j]);
book[t] = true;
}
if (dist[n] != INF) return dist[n];
return -1;
}
//-------------------------------------------------------
int main()
{
cin >> n >> m;
init();
for (int i = 1; i <= m; i++)
{
int a, b, len; cin >> a >> b >> len;
map[a][b] = min(map[a][b], len);
}
int ans = dijkstra();
cout << ans << endl;
}
//-------------------------------------------------------
/*
*/
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
int const INF = 0x3f3f3f3f;
//-------------------------------------------------------
int const N = 1e4 + 10;
int n, m, k;
int dist[N], backup[N];
struct edge
{
int a, b, len;
}e[N];
//-------------------------------------------------------
int main()
{
cin >> n >> m >> k;
for (int i = 1; i <= m; i++)
cin >> e[i].a >> e[i].b >> e[i].len;
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
for (int i = 1; i <= k; i++)
{
memcpy(backup, dist, sizeof dist);
for (int j = 1; j <= m; j++)
{
int a = e[j].a;
int b = e[j].b;
int len = e[j].len;
dist[b] = min(dist[b], backup[a] + len);
}
}
if (dist[n] > INF / 2) cout << "impossible" << endl;
else cout << dist[n] << endl;
}
//-------------------------------------------------------
/*
*/
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
int const INF = 0x3f3f3f3f;
//-------------------------------------------------------
int const N = 210;
int map[N][N];
int n, m, t;
void init()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i == j) map[i][j] = 0;
else map[i][j] = INF;
}
//-------------------------------------------------------
int main()
{
cin >> n >> m >> t;
init();
for (int i = 1; i <= m; i++)
{
int a, b, len; cin >> a >> b >> len;
map[a][b] = min(map[a][b], len);
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
while (t--)
{
int a, b; cin >> a >> b;
if (map[a][b] >= INF / 2) cout << "impossible" << endl;
else cout << map[a][b] << endl;
}
}
//-------------------------------------------------------
/*
*/
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
int const INF = 0x3f3f3f3f;
//-------------------------------------------------------
int const N = 510;
int map[N][N],dist[N];
int n, m;
bool book[N];
void init()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j) map[i][j] = 0;
else map[i][j] = INF;
}
}
}
int prim()
{
int res = 0;
memset(dist, 0x3f, sizeof dist);
for (int i = 1; i <= n; i++)
{
int t = -1;
for (int j = 1; j <= n; j++)
if ((t == -1 || dist[t] > dist[j]) && !book[j]) t = j;
if (i != 1 && dist[t] == INF) return INF;
if (i != 1) res += dist[t];
for (int j = 1; j <= n; j++)
dist[j] = min(dist[j], map[t][j]);
book[t] = true;
}
return res;
}
//-------------------------------------------------------
int main()
{
cin >> n >> m;
init();
for (int i = 1; i <= m; i++)
{
int a, b, len; cin >> a >> b >> len;
map[a][b] = map[b][a] = min(map[a][b], len);
}
int ans = prim();
if (ans == INF) cout << "impossible" << endl;
else cout << ans << endl;
}
//-------------------------------------------------------
/*
*/
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
int const INF = 0x3f3f3f3f;
//-------------------------------------------------------
int const N = 1e5 + 10, M = 2e5 + 10;
int p[N];
struct edge
{
int a, b, len;
}e[M];
bool cmp(edge a, edge b)
{
return a.len < b.len;
}
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
//-------------------------------------------------------
int main()
{
int n, m; cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int a, b, len; cin >> a >> b >> len;
e[i] = { a,b,len };
}
sort(e + 1, e + 1 + m, cmp);
for (int i = 1; i <= n; i++) p[i] = i;
int ans = 0; int cnt = 0;
for (int i = 1; i <= m; i++)
{
int a = e[i].a;
int b = e[i].b;
int len = e[i].len;
a = find(a);
b = find(b);
if (a != b)
{
cnt++;
ans += len;
p[a] = b;
}
}
if (cnt < n - 1) cout << "impossible" << endl;
else cout << ans << endl;
}
//-------------------------------------------------------
/*
*/