using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CompProgLib;

namespace ALDS1_15_B
{
    public class Program

    {
        public struct Node:IComparable<Node>
        {
            public int Value { get; private set; }
            public int Weight { get; private set; }
            public double ValuePerWaight { get; private set; }

            public Node(int v,int w)
            {
                Value = v;
                Weight = w;
                ValuePerWaight = v / (double)w;
            }

            public int CompareTo(Node other)
            {
                if (ValuePerWaight - other.ValuePerWaight > 0)
                {
                    return 1;
                }
                else if (ValuePerWaight - other.ValuePerWaight < 1)
                {
                    return -1;
                }
                else { return 0; }
            }
        }

        public static void Main(string[] args)
        {
            int[] line = ReadIntAr();
            PriorityQueue<Node> pq = new PriorityQueue<Node>();

            for (int i = 0 ; i < line[0] ; i++)
            {
                int[] item = ReadIntAr();
                pq.Enqueue(new Node(item[0], item[1]));
            }

            int CurrentWeight = 0;
            decimal CurrentValue = 0;

            while (pq.Count > 0)
            {
                Node tmp = pq.Dequeue();

                if (CurrentWeight + tmp.Weight <= line[1])
                {
                    CurrentWeight += tmp.Weight;
                    CurrentValue += tmp.Value;
                }
                else
                {
                    int remainingWeight = line[1] - CurrentWeight;
                    CurrentWeight += remainingWeight;
                    CurrentValue += (decimal)tmp.ValuePerWaight * remainingWeight;
                    break;
                }            
            }
            Console.WriteLine(CurrentValue.ToString("F8"));
        }

        static string ReadSt() { return Console.ReadLine(); }
        static int ReadInt() { return int.Parse(Console.ReadLine()); }
        static long ReadLong() { return long.Parse(Console.ReadLine()); }
        static double ReadDouble() { return double.Parse(Console.ReadLine()); }
        static string[] ReadStAr(char sep = ' ') { return Console.ReadLine().Split(sep); }
        static int[] ReadIntAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Split(sep), e => int.Parse(e)); }
        static long[] ReadLongAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Split(sep), e => long.Parse(e)); }
        static double[] ReadDoubleAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Split(sep), e => double.Parse(e)); }

    }

}

namespace CompProgLib
{
    public class PriorityQueue<T> where T : IComparable<T>

    {

        private List<T> Buffer { get; set; }

        public int Count { get { return Buffer.Count; } }

        public PriorityQueue() { Buffer = new List<T>(); }
        public PriorityQueue(int capacity) { Buffer = new List<T>(capacity); }


        /// <summary>
        /// ヒープ化されている配列リストに新しい要素を追加する。
        /// </summary>
        public void Enqueue(T item)
        {
            int n = Buffer.Count;
            Buffer.Add(item);

            while (n != 0)
            {
                int i = (n - 1) / 2;
                if (Buffer[n].CompareTo(Buffer[i]) > 0)
                {
                    T tmp = Buffer[n]; Buffer[n] = Buffer[i]; Buffer[i] = tmp;
                }
                n = i;
            }
        }

        /// <summary>
        /// ヒープから最大値を取り出し、削除する。
        /// </summary>
        public T Dequeue()
        {
            T ret = Buffer[0];
            int n = Buffer.Count - 1;
            Buffer[0] = Buffer[n];
            Buffer.RemoveAt(n);

            for (int i = 0, j ; (j = 2 * i + 1) < n ;)
            {
                if ((j != n - 1) && (Buffer[j].CompareTo(Buffer[j + 1]) < 0))
                    j++;
                if (Buffer[i].CompareTo(Buffer[j]) < 0)
                {
                    T tmp = Buffer[j]; Buffer[j] = Buffer[i]; Buffer[i] = tmp;
                }
                i = j;
            }
            return ret;
        }

        /// <summary>
        /// ヒープから最大値を参照する。
        /// </summary>
        public T Peek()
        {
            if (Count == 0) throw new InvalidOperationException();
            return this.Buffer[0];
        }
    }
}


Measured memory_bytes: 25284