#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T sqr(const T &a) {
  return a * a;
}
template <class T>
inline int len(const T &c) {
  return static_cast<int>(c.size());
}
template <class T>
inline bool maximize(T &r, const T c) {
  if (r < c) {
    r = c;
    return true;
  }
  return false;
}
template <class T>
inline bool minimize(T &r, const T c) {
  if (r > c) {
    r = c;
    return true;
  }
  return false;
}
const long double EPS = 1e-9;
const long double PI = 2 * acos(0.0);
const int N = 100;
struct TopK {
  set<pair<int, int>> top;
  set<pair<int, int>> tail;
  int k;
  int total;
  TopK(int ka) : k(ka), total(0) {}
  void Clear() {
    total = 0;
    top.clear();
    tail.clear();
  }
  void Balance() {
    while (len(top) > k) {
      auto it = top.rbegin();
      tail.insert(*it);
      top.erase(*it);
    }
    while (len(top) < k && !tail.empty()) {
      auto it = tail.begin();
      top.insert(*it);
      tail.erase(it);
    }
  }
  void Add(pair<int, int> p) {
    p.first = -p.first;
    if (total < k) {
      top.insert(p);
    } else {
      int tlast = top.rbegin()->first;
      if (p.first > tlast) {
        tail.insert(p);
      } else {
        top.insert(p);
      }
    }
    ++total;
    Balance();
  }
  void Remove(pair<int, int> p) {
    auto it = top.find(p);
    if (it == top.end()) {
      tail.erase(p);
    } else {
      top.erase(it);
    }
    --total;
    Balance();
  }
  bool HasK() { return total >= k; }
  pair<int, int> GetKth() {
    pair<int, int> result = *(top.rbegin());
    result.first = -result.first;
    return result;
  }
};
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  vector<pair<int, int>> a;
  vector<pair<int, pair<int, int>>> events;
  for (int i = 0; i < n; ++i) {
    int lf, rg;
    scanf("%d%d", &lf, &rg);
    a.push_back({lf, rg});
    events.push_back({lf, {0, i}});
    events.push_back({rg, {1, i}});
  }
  TopK topk(k);
  sort(events.begin(), events.end());
  int best_leng = -1;
  for (int e = 0; e < len(events); ++e) {
    auto &ev = events[e];
    int id = ev.second.second;
    if (ev.second.first) {
      topk.Remove({a[id].second, id});
    } else {
      topk.Add({a[id].second, id});
      if (topk.HasK()) {
        pair<int, int> kth = topk.GetKth();
        int leng = kth.first - ev.first + 1;
        maximize(best_leng, leng);
      }
    }
  }
  if (best_leng < 0) {
    puts("0");
    for (int i = 1; i <= k; ++i) {
      printf("%d ", i);
    }
    puts("");
    return 0;
  }
  printf("%d\n", best_leng);
  topk.Clear();
  for (int e = 0; e < len(events); ++e) {
    auto &ev = events[e];
    int id = ev.second.second;
    if (ev.second.first) {
      topk.Remove({a[id].second, id});
    } else {
      topk.Add({a[id].second, id});
      if (topk.HasK()) {
        pair<int, int> kth = topk.GetKth();
        int leng = kth.first - ev.first + 1;
        if (leng == best_leng) {
          assert(k == len(topk.top));
          for (auto &p : topk.top) {
            printf("%d ", p.second + 1);
          }
          puts("");
          return 0;
        }
      }
    }
  }
  throw 1;
}
