#include <bits/stdc++.h>
#pragma pack(1)
#pragma GCC optimize("O3")
using namespace std;
const int inf = 1000000000;
const long long INF = 1LL * inf * inf;
const long double eps = 1e-9;
const long long md = 1e9 + 7;
const long double EPS = 1e-5;
const long long maxll = std::numeric_limits<long long>::max();
const long double PI = acos(-1.0);
template <typename name>
inline name sqr(name x) {
  return x * x;
}
double log(double base, double n) { return log(n) / log(base); }
inline long long multmod(long long a, long long b, long long md) {
  if (!a) return 0;
  if (a % 2 == 1)
    return (multmod(a - 1, b, md) + b) % md;
  else
    return sqr(multmod(a / 2, b, md)) % md;
}
template <typename name>
inline name bpow(const name& base, long long exp, const long long& md = maxll) {
  if (exp == 1) return base;
  if (exp % 2 == 1)
    return (bpow<name>(base, exp - 1, md) * base) % md;
  else {
    name k = bpow<name>(base, exp / 2, md);
    return (k * k) % md;
  }
}
unsigned char ccc;
inline void read(int& n) {
  n = 0;
  bool _minus = false;
  while (true) {
    ccc = getchar();
    if (ccc == ' ' || ccc == '\n') break;
    if (ccc == '-') {
      _minus = true;
      continue;
    }
    n = n * 10 + ccc - '0';
  }
  if (_minus) n *= -1;
}
inline void read(int& n, int& m) {
  read(n);
  read(m);
}
inline void read(int& n, int& m, int& k) {
  read(n);
  read(m);
  read(k);
}
inline void read(std::string& s) {
  s = "";
  while (true) {
    ccc = getchar();
    if (ccc == ' ' || ccc == '\n') break;
    s += ccc;
  }
}
template <typename T1, typename T2>
inline T1 min(const T1 x, const T2 y) {
  return (x > y ? y : x);
}
template <typename T1, typename T2>
inline T1 max(const T1 x, const T2 y) {
  return (x < y ? y : x);
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& rhs) {
  os << rhs.first << " " << rhs.second;
  return os;
}
template <typename T1>
ostream& operator<<(ostream& os, const vector<T1>& rhs) {
  for (int i = 0; i < (int)rhs.size(); i++)
    cout << rhs[i] << (i == (int)rhs.size() - 1 ? "" : " ");
  return os;
}
const int MAXN = 1010;
int dp[81][81][81][81], n, k, m, a[81][81], ans = inf;
queue<pair<std::pair<int, int>, std::pair<int, int> > > q;
int main() {
  (("" != "") ? freopen(""
                        ".in",
                        "r", stdin),
   freopen(""
           ".out",
           "w", stdout)
              : 0);
  scanf("%d%d", &n, &k);
  scanf("%d", &m);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) a[i][j] = inf;
  for (int i = 0; i < m; i++) {
    int x, y, c;
    scanf("%d%d%d", &x, &y, &c);
    a[x][y] = min(a[x][y], c);
  }
  for (int i = 1; i <= 80; i++)
    for (int j = 1; j <= 80; j++)
      for (int k = 1; k <= 80; k++)
        for (int q = 1; q <= 80; q++) dp[i][j][k][q] = inf;
  for (int i = 1; i <= n; i++) {
    dp[1][n][i][1] = 0;
    q.push(make_pair(make_pair(1, n), make_pair(i, 1)));
  }
  while (!q.empty()) {
    auto cur = q.front();
    q.pop();
    int l = cur.first.first;
    int r = cur.first.second;
    int x = cur.second.first;
    int cnt = cur.second.second;
    if (cnt == k) ans = min(ans, dp[l][r][x][cnt]);
    for (int i = l; i < x; i++) {
      if (a[x][i] != inf) {
        if (dp[l][x - 1][i][cnt + 1] == inf)
          q.push(make_pair(make_pair(l, x - 1), make_pair(i, cnt + 1)));
        dp[l][x - 1][i][cnt + 1] =
            min(dp[l][x - 1][i][cnt + 1], dp[l][r][x][cnt] + a[x][i]);
      }
    }
    for (int i = x + 1; i <= r; i++) {
      if (a[x][i] != inf) {
        if (dp[x + 1][r][i][cnt + 1] == inf)
          q.push(make_pair(make_pair(x + 1, r), make_pair(i, cnt + 1)));
        dp[x + 1][r][i][cnt + 1] =
            min(dp[x + 1][r][i][cnt + 1], dp[l][r][x][cnt] + a[x][i]);
      }
    }
  }
  if (ans != inf)
    cout << ans;
  else
    cout << -1;
}
